【问题标题】:generating completely random even numbers with C#用 C# 生成完全随机的偶数
【发布时间】:2012-05-17 07:14:02
【问题描述】:

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

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

【问题讨论】:

  • 完全随机?我认为没有人知道如何产生经过验证的随机序列,只有伪随机。
  • 随机可以重复。它仍然是随机的。通过排除以前看到的值,您绝对是不是随机的。
  • 你应该为你的控件命名。
  • 从一个非常好的普通随机数开始,然后乘以 2。随机两倍! :-)
  • 可以重复!当然!但是相同的三个数字在 15-20 个数字之后重复出现的概率是多少?这就是我所拥有的!它不是“随机的”——它是“重复的”

标签: c# winforms random numbers


【解决方案1】:
textBox4.Text = (2 * rand.Next(min / 2, max / 2)).ToString();

【讨论】:

  • 在 100k 次迭代后,您的解决方案速度是原来的两倍!唯一值得一提的是您不需要减去 1。例如,要获得区间 [0-988] 中的值,我需要将“min”设置为 0,将“max”设置为 1k。如果你想得到 [0-1000] 那么“最大值”应该设置为 1001。
【解决方案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();
}

【讨论】:

    【解决方案3】:
    Random random = new Random();
    
    int nextnum = random.Next(min/2,max/2) * 2
    

    【讨论】:

      【解决方案4】:

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

      按照其他人的建议,您只需将结果乘以 2 即可得到偶数。

      【讨论】:

        【解决方案5】:

        你的方法有很多缺陷。

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-08
          • 2015-06-18
          • 2020-01-31
          • 1970-01-01
          • 2013-05-05
          • 2012-03-18
          • 2015-07-19
          相关资源
          最近更新 更多