我想了解C#Random.next()
是如何工作的,所以我开始搜索一些东西,然后我就会从时钟中获取随机种子:DateTime.Now.Millisecond
。所以我想如果你连续创建了很多Random对象,它会吐出相同的数字,我想检查一下并创建这个代码片段。
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#所以如果我犯了很多错误,我很抱歉。
答案 0 :(得分:2)
根据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));
}
它应该产生预期的输出。试试吧!
答案 1 :(得分:0)
从一组有限的数字中以相等的概率选择伪随机数。所选择的数字不是完全随机的,因为使用数学算法来选择它们,但是出于实际目的它们是足够随机的。 Random类的当前实现基于Donald E. Knuth的减法随机数生成器算法的修改版本。
每次执行新的Random()时,都会使用时钟进行初始化。这意味着在紧密循环中,您可以多次获得相同的值。您应该保留一个Random实例并继续在同一个实例上使用Next。
试试这个
static void Main(string[] args)
{
Random rn= new Random();
while (true)
{
Console.WriteLine(DateTime.Now.Millisecond.ToString());
Console.WriteLine(rn.Next(10));
}
}