“new Random(x)”总是生成相同的数字?

时间:2012-04-20 02:13:05

标签: c# random

我想获得一个唯一的随机数,但每次运行代码时我都会得到相同的数字。我会先得到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);

2 个答案:

答案 0 :(得分:17)

替换:

Random rand = new Random(numCards);

Random rand = new Random();

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

enter image description here

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

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

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

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

答案 1 :(得分:3)

Random Class

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

如果使用不带参数的构造函数,Random对象将在当前时间使用种子值,因此使用此构造函数实例化的每个Random对象将具有不同的随机数序列,只要时间种子值不同即可。很可能。

如果两个不同的Random对象在时间上彼此非常接近地初始化,你仍然可以获得相同的数字序列。

Random Constructor

相关问题