3

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

2 回答 2

17

代替:

Random rand = new Random(numCards);

Random rand = new Random();

在构造函数调用中提供一个固定的种子值(numCards始终具有相同的值)将产生一个可预测的、可重现的序列,对于相同的种子值,该序列始终相同,就像这样(不完全是,但该点仍然有效):Random

在此处输入图像描述

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

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

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

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

于 2012-04-20T02:14:56.957 回答
3

随机类

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

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

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

随机构造函数

于 2012-04-20T02:23:07.480 回答