2

有什么好的方法可以用 C#生成随机偶数吗?我想出了这段代码:

    Random RandString = new Random(0);

代码:

    private void button6_Click(object sender, EventArgs e)
    {
        int min = 0;
        int max = 50;

        int rand = RandString.Next(min, max-1);
        while (rand % 2 == 1) // odd
        {
            rand = RandString.Next(min, max-1);
        }

        textBox4.Text = "" + rand;
    }

这段代码的问题:

  • 我目前的解决方案可能不是最快的
  • 很多时候,这种方法生成的数字会以相同的顺序重复!例如,经过 5 次迭代后,我可以得到:8、10、20、30、16。更多点击(大约 15 秒)后,我可以连续得到 10、30、20或 30、20、10 .. 我是不确定,但这不是我所说的“随机”。

那么有什么方法可以解决我所描述的问题,还是有其他方法?

4

5 回答 5

9
textBox4.Text = (2 * rand.Next(min / 2, max / 2)).ToString();
于 2012-05-08T19:03:53.817 回答
2

更容易的是把你的结果乘以 2

private void button6_Click(object sender, EventArgs e)
{
    int min = 0;
    int max = 25;

    int rand = RandString.Next(min, max-1)*2;

    textBox4.Text = rand.ToString();
}
于 2012-05-08T19:04:04.457 回答
2
Random random = new Random();

int nextnum = random.Next(min/2,max/2) * 2
于 2012-05-08T19:04:27.463 回答
1

你的方法有很多缺陷。

首先,Random来自 .NET 在密码学意义上的 AFAIK 并不是完全随机的,但它应该比您报告的结果要好得多。Random最有可能的是,您在循环的每次迭代中都创建了一个新对象;由于当前系统时间用于播种 RNG,因此如果您一个接一个地运行很短,您将获得相同的伪随机数序列。相反,在启动时创建一个实例Random,并尽可能长时间地保留它。

然后,从一个随机整数创建一个偶数比循环直到找到一个恰好是偶数要容易得多:只需生成一个随机数并清除最低有效位:myRand.Next(min, max-1) & ~1;. 一个体面的 RNG 在其所有位上具有均匀分布,因此清除任何位不应使熵减少超过一位。

回到“完全随机”部分:Random提供一个伪随机数生成器。它被播种一次,基于一个有点随机的值(当前系统时间中最不重要的部分),但给定相同的种子,RNG 将在每次运行时可靠且确定地产生相同的数字。如果您想要真正的随机性(又名“熵”),您会惊讶于在为确定性计算而构建的机器上生成它是多么困难。UNIX 和类 Unix 系统通常通过一个特殊的内核生成文件(/dev/random),使用诸如硬盘访问时间、网络噪声以及他们可以找到的任何其他实际随机性来源,并使用相当复杂的计算将它们提炼成均匀分布。Windows 可能也可以这样做,但我不知道 .NET 或经典 win32 API 中有任何 API。

于 2012-05-08T19:14:03.777 回答
1

您可以使用RNGCryptoServiceProvider来获得“更随机”(我承认这是一个愚蠢的术语)数字。MSDN 的文档页面上有一个很好的示例。

正如其他人建议的那样,您只需将结果乘以 2 即可得到偶数。

于 2012-05-08T19:08:56.573 回答