【问题标题】:"new Random(x)" always generates the same numbers? [duplicate]“new Random(x)”总是生成相同的数字? [复制]
【发布时间】:2012-04-20 02:13:05
【问题描述】:

我试图获得一个唯一的随机数,但每次运行代码时我总是得到相同的数字。我会先得到 14,然后是 6,但我保存所有已使用数字的列表似乎不起作用。手动添加 14 可以,但是当我添加 randInt 时它不起作用。

const int numCards = 32;
        List<int> usedCards = new List<int>();
        int randInt = 0;
        Random rand = new Random(numCards);
        usedCards.Add(14);
        do
        {

            randInt = rand.Next(0, numCards);
            MessageBox.Show(randInt.ToString(), "End Game", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

        }
        while (usedCards.Contains(randInt));

        usedCards.Add(randInt);

【问题讨论】:

  • @Alexei:这是一个不同的错误——每次使用都会产生一个新的Random
  • @AlexeiLevenkov “几乎”,但这更……具体。然而,这是一个很好的相关问题。

标签: c# random


【解决方案1】:

替换:

Random rand = new Random(numCards);

Random rand = new Random();

Random constructor 调用中提供固定 种子值(numCards 始终具有相同的值)将导致可预测可重现 em> 序列对于相同的种子值总是相同的,就像这样(不完全但仍然有效):

例如,使用固定种子1 并在我的机器上绘制从 0 到 100 的 10 个数字总是产生序列

24,11,46,77,65,43,35,94,10,64

另一方面,不使用种子值,序列变得不可预测。

如果没有传入种子值,Random 将根据当前时间生成一个新的种子值,这就是你想要得到一个新的随机数序列的东西 - 前提是你不以快速顺序再次初始化它,这就是为什么您应该重复使用 Random 实例而不是每次都重新创建它们。

【讨论】:

  • 抱歉,在这种情况下需要包含此内容:xkcd.com/221
  • @David Z.:为什么?这根本不是一回事。
  • 谢谢,我相信现在有效。现在讨论我的代码的其他问题
  • 很好的答案。非常漂亮的图片 :) 您在 Casino 中找到了程序算法的一部分。 :)
【解决方案2】:

Random Class

如果你给 Random 类的构造函数指定一个种子值,它每次都会生成相同的序列。产生随机数序列的算法是确定性的。

如果使用不带参数的构造函数,Random对象会使用当前时间的种子值,所以使用该构造函数实例化的每个Random对象,只要时间种子值不同,就会有不同的随机数序列很有可能。

如果两个不同的 Random 对象的初始化时间非常接近,您仍然可以从它们获得相同的数字序列。

Random Constructor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2019-06-14
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    相关资源
    最近更新 更多