【问题标题】:How does C#'s random number generator work?C# 的随机数生成器是如何工作的?
【发布时间】:2012-11-12 11:04:35
【问题描述】:

我只是想知道 C# 中的随机数生成器是如何工作的。我也很好奇如何编写一个程序来生成从 1 到 100 的随机 Whole INTEGER 数字。

【问题讨论】:

  • 随机随机=新随机(); random.Next(1, 101); // 包括 1 和 100 random.Next(1, 100); // 包括 1 不包括 100
  • @AmazingDreams:不,下限是包含
  • @JonSkeet 谢谢,我已经有一段时间没有使用它了。进行了编辑。
  • inclusive 表示从 1 到 100 的任何数字,包括 1?然后如果是这样,101 是独占的,所以它包括 100?
  • @SethTaddiken:是的,这就是我给出答案的原因。

标签: c# random numbers generator


【解决方案1】:

你可以使用Random.Next(int maxValue):

返回: 大于或等于零且小于的 32 位有符号整数 最大值;也就是说,返回值的范围通常包括零 但不是最大值。但是,如果 maxValue 等于 0,则 maxValue 为 返回。

var r = new Random();
// print random integer >= 0 and  < 100
Console.WriteLine(r.Next(100));

但是对于这种情况,您可以使用Random.Next(int minValue, int maxValue),如下所示:

// print random integer >= 1 and < 101
Console.WriteLine(r.Next(1, 101);)
// or perhaps (if you have this specific case)
Console.WriteLine(r.Next(100) + 1);

【讨论】:

  • @SethTaddiken:嗯,它不符合你要求的要求,这是一个介于 1 和 100 之间的数字。它永远不会给你 100,但它 给你0。此外,你应该确保你真的明白你不应该每次都创建一个Random的新实例。
  • 如果我打印出来的变量是 1 到 100 之间的随机数,会是什么样子?
  • 将“(r.Next(100))”中的 100 设为 101 是否包含 100?
  • @SethTaddiken 是的,它会的,请查看来自 MSDN 的报价和我的评论(在代码中)。在这种情况下,@JonSkeet 提供了正确且更多的答案。我赞成他的回答,因为它看起来更好。我个人会接受他的回答。范围很精确:value &gt;= minValue &amp;&amp; value &lt; maxValue
  • 无论如何,我已经编辑了我的答案以提供您所要求的答案。看看 MSDN,它解释得很好
【解决方案2】:

我只是想知道 C# 中的随机数生成器是如何工作的。

这是特定于实现的,但wikipedia entry for pseudo-random number generators 应该会给你一些想法。

我也很好奇如何编写一个程序来生成从 1 到 100 的随机整数。

你可以使用Random.Next(int, int):

Random rng = new Random();
for (int i = 0; i < 10; i++)
{
    Console.WriteLine(rng.Next(1, 101));
}

请注意,上限是独有的 - 这就是我在这里使用 101 的原因。

您还应该注意与Random 相关的一些“陷阱” - 特别是,您应该在每次要生成随机数时创建一个新实例,否则如果您在短时间内生成大量随机数,您会看到很多重复。详情请见my article on this topic

【讨论】:

  • 我能说“随机随机=新随机.Next(0, 101);”之类的话吗?
  • @SethTaddiken:不,你不能。 (我的名字是 Jon,而不是 John。)根据您今天到目前为止的问题,我强烈建议您获取一本好的 C# 入门书籍。对于初始学习来说,这可能比在这里询问更有效。
  • 好吧,您可以阅读一本书,但当您尝试使用不同的程序时仍然需要帮助,并且您无法立即获得信息。
  • @JonSkeet 我知道这是旧线程,但我最近也在摸不着头脑,为什么 Random 确实返回了不那么随机的数字。当在 Parallel.For() 中执行时,使用静态 Random 类确保接近真实随机性的唯一方法是在生成新随机数时锁定(Random){}。但是,我更喜欢你的方法。它很聪明,提供执行速度和线程安全。发现不必担心耗尽 Int32 存储空间也很有趣,因为在达到 MaxValue 后,它会简单地翻转到 MinValue。不错不错,确实不错。
【解决方案3】:

我在互联网上搜索 RNG 已经有一段时间了。我看到的一切要么太复杂,要么不是我想要的。在阅读了几篇文章后,我能够想出这个简单的代码。

{
  Random rnd = new Random(DateTime.Now.Millisecond);
  int[] b = new int[10] { 5, 8, 1, 7, 3, 2, 9, 0, 4, 6 };
  textBox1.Text = Convert.ToString(b[rnd.Next(10)])
}

简单解释,

  1. 创建一维整数数组。
  2. 用无序数字填满数组。
  3. 使用 rnd.Next 获取将被选中的号码的位置。

这很好用。

要获得小于 100 的随机数,请使用

{
  Random rnd = new Random(DateTime.Now.Millisecond);
  int[] b = new int[10] { 5, 8, 1, 7, 3, 2, 9, 0, 4, 6 };
  int[] d = new int[10] { 9, 4, 7, 2, 8, 0, 5, 1, 3, 4 };
  textBox1.Text = Convert.ToString(b[rnd.Next(10)]) + Convert.ToString(d[rnd.Next(10)]);
}

3、4、5 和 6 ... 位随机数以此类推。

希望这对某人有积极的帮助。

【讨论】:

  • rnd.Next(10) 已经为您提供了所需范围内的数字。您不需要 1~10 之间的数字数组来查找
【解决方案4】:

如果你像这样使用它就很容易了

Random random = new Random();

int answer = random.Next(0);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2012-07-08
  • 2011-10-30
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多