C#的随机数生成器是如何工作的?

31

我想知道C#中的随机数生成器是如何工作的。同时我也好奇如何编写一个程序来产生1-100之间的整数随机数。


2
随机数 random = new 随机数(); random.Next(1, 101); // 包括1和100 random.Next(1, 100); // 包括1但不包括100 - AmazingDreams
3
不,下限是包含在内的。 - Jon Skeet
@JonSkeet 谢谢,我有一段时间没有用过这个。做了一个编辑。 - AmazingDreams
包含指的是从1到100之间的所有数字,包括1吗?如果是的话,101就是不包含的,这样它就包括100了吗? - Seth Taddiken
@SethTaddiken:是的,这就是为什么我给出了我的答案。 - Jon Skeet
4个回答

32

您可以使用Random.Next(int maxValue)方法:

返回值: 一个大于等于零且小于 maxValue 的 32 位有符号整数;换句话说,返回值的范围通常包括零但不包括 maxValue。但是,如果maxValue等于零,则返回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 实例。 - Jon Skeet
如果我打印出来的变量是1到100之间的随机数,它会是什么样子? - Seth Taddiken
将“(r.Next(100))”中的100改为101会使100包含在内吗? - Seth Taddiken
@SethTaddiken 是的,它会,请看一下 MSDN 的引用和我的评论(在代码中)。在这种情况下,@JonSkeet 提供了正确且更全面的答案。我已经为他的回答点赞,因为它似乎更好。就个人而言,我会接受他的答案。范围确切地是:value >= minValue && value < maxValue - Zbigniew
不过,我已经编辑了我的答案,为你提供了所要求的答案。看一下MSDN,它解释得非常清楚。 - Zbigniew

24

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

那要看具体实现,但伪随机数生成器的维基百科词条可以给您一些思路。

我还想知道如何编写一个程序,以生成介于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相关的一些“陷阱”-特别是,您不应该每次想要生成随机数时都创建一个新实例,否则如果您在短时间内生成了大量随机数,您将看到很多重复。有关更多详细信息,请参见我关于这个主题的文章


我可以直接这样说吗:"Random random = new Random.Next(0, 101);"? - Seth Taddiken
2
@SethTaddiken:不,你不能这样做。(我的名字是Jon,不是John。)根据你今天迄今为止的问题,我强烈建议你找一本好的入门C#书籍。相比在这里提问,它可能更有效地帮助你进行初步学习。 - Jon Skeet
即使您正在阅读一本书,当您尝试玩弄不同的程序时仍然需要帮助,而且信息并不立即可用。 - Danrex
@JonSkeet 我知道这是一个旧的帖子,但最近我也一直在纠结为什么随机数发生器会返回不太随机的数字。当在Parallel.For()中执行时,确保使用静态Random类接近真正的随机性的唯一方法就是在生成新的随机数时进行lock(Random){}。然而,我更喜欢您的做法。它很聪明,提供了执行速度和线程安全性。此外,发现不用担心耗尽Int32存储空间,因为达到MaxValue后,它会简单地翻转到MinValue。相当不错,非常不错。 - Darek

0

如果你只是像这样使用它,那就很容易了。

Random random = new Random();

int answer = random.Next(0);

0

我已经在互联网上搜索了一段时间的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位随机数,依此类推。

希望这能对某人有所帮助。


1
rnd.Next(10)已经给你一个在需要范围内的数字。你不需要一个1~10之间的数字数组来查找。 - AaA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接