使用C#生成完全随机的偶数

时间:2012-05-08 19:01:52

标签: c# winforms random numbers

使用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 ..我不确定,但这不是我所谓的“随机”。

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

5 个答案:

答案 0 :(得分:8)

textBox4.Text = (2 * rand.Next(min / 2, max / 2)).ToString();

答案 1 :(得分: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();
}

答案 2 :(得分:2)

Random random = new Random();

int nextnum = random.Next(min/2,max/2) * 2

答案 3 :(得分:1)

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

正如其他人推荐的那样,您可以将结果乘以2得到偶数。

答案 4 :(得分:1)

您的方法存在许多缺陷。

首先,来自.NET的Random在加密意义AFAIK中并不是完全随机的,但它应该比您报告的结果好得多。最有可能的是,您在循环的每次迭代中都创建了一个新的Random对象;因为当前的系统时间用于为RNG播种,所以如果你经常跑得非常短,你会得到相同的伪随机数序列。相反,在启动时创建一个Random实例,并尽可能长时间保持它。

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

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