c# - C# Random 类是如何工作的

标签 c# random

我想了解 C# Random.next() 是如何工作的,所以我开始搜索一些东西,然后我将它标记为红色,它从时钟中获取随机种子,如下所示:DateTime.Now .毫秒。所以我想如果你连续创建很多随机对象它会吐出相同的数字,我想检查一下并创建这个代码片段。

static void Main(string[] args)
        {
            Random rn;
            while (true)
            {
                rn = new Random();
                Console.WriteLine(DateTime.Now.Millisecond.ToString());
                Console.WriteLine(rn.Next(10));
            }

        }

当我运行它时,我当然得到了很多相同的数字,但我认为当 DateTime.Now.Millisecond 将要改变时,它也会改变随机数,但正如您在此输出中看到的那样,情况并非如此。

9
127
9
127
9
127
9
127
9
127
9
127
9
127
9
128
9
128
9
128
9
128
9
128
9

那么为什么 DateTime.Now.Millisecond 改变时随机数没有改变?请注意,我刚刚开始学习 C#,所以如果我犯了很多错误,我深表歉意。

最佳答案

根据source code ,无参数构造函数定义为:

  public Random() 
    : this(Environment.TickCount) {
  }

这意味着它不使用 DateTime.Now.Millisecond 作为种子,而是使用 Environment.TickCount 值。

所以如果你这样写你的代码:

Random rn;
while (true)
{
    rn = new Random();
    Console.WriteLine(Environment.TickCount);
    Console.WriteLine(rn.Next(10));
}

它应该产生预期的输出。试试吧!

关于c# - C# Random 类是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39054773/

相关文章:

c# - 为什么 yield return 不能出现在带有 catch 的 try block 中?

c# - 我将如何连接/替换 “end user” YSOD?

c# - 验证公共(public)/私有(private)方法的函数参数时的最佳实践

c# - 将文件从一个项目复制到另一个项目时出错

C11 替代兰特?

c - 为 RANSAC 采样生成两个随机数

c++ - rand() 和 random() 函数有什么区别?

c# - 单元测试 .Net CORE 2.0 WebAPI - 带有文本流正文的模拟(最小起订量)HTTP POST(非模型)

r - 从 n 组数字中生成 x 个随机数

c - 键盘模拟失败