C#随机不像随机那样工作 [英] C# Random does not work like a random
问题描述
我有一个图,每个节点有4个子节点.我编写了一种算法来生成从开始节点到结束节点的随机路径.在每个节点上,它选择一个随机的下一个节点.可以重新访问被访问的节点.
I have a graph, each node have 4 child nodes. I wrote a algorithm to generate a random path from a begin node to an end node. At each node, it chooses a random next node. Visited node can be revisited.
代码如下:
public List<Node> GetPath(Node begin, Node end)
{
var nodes = new List<Node>();
var node = begin;
while (node != end)
{
nodes.Add(node);
var next = node.Children[new Random().Next(4)];
node = next;
}
nodes.Add(end);
return nodes;
}
但是有时候,随机模式不能按预期工作."new Random().Next(4)"继续生成0.因此,它始终是第一个子节点被选择,并且会生成很长的重复序列,例如node1-> node2-> node1-> node2 ...,最终发生内存不足异常.
But sometimes, the Random does not work as expected. The "new Random().Next(4)" keeps generating 0. So it is always the first child node get chose and a very long repeat sequence like node1->node2->node1->node2... is generated and eventually an out of memory exception happens.
有没有一种方法可以使Random类正常工作?
Is there a way to make the Random class works correctly?
推荐答案
原因是因为Random是根据当前时间初始化的(计算机中没有真正的随机数,而只是psuedo随机数).while循环迭代太快,并且系统时间尚未记录更改.因此,您要重新初始化一个以相同值开头的新Random对象.
The reason is because Random is initialized based on the current time (there is no true random in computers... only psuedo-random). The while loop iterates too quickly, and the system time has not registered a change. So you're re-initializing a new Random object that starts with the same value.
尝试创建一个可在整个方法中重复使用的随机对象:
Try creating one Random object that is reused throughout the method:
public List<Node> GetPath(Node begin, Node end)
{
var nodes = new List<Node>();
var node = begin;
Random r = new Random();
while (node != end)
{
nodes.Add(node);
var next = node.Children[r.Next(4)];
node = next;
}
nodes.Add(end);
return nodes;
}
这篇关于C#随机不像随机那样工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!