我有一个图,每个节点有 4 个子节点。我编写了一个算法来生成从开始节点到结束节点的随机路径。在每个节点,它选择一个随机的下一个节点。访问过的节点可以重新访问。
代码如下:
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...发生内存不足异常。
有没有办法让 Random 类正常工作?
原因是因为 Random 是根据当前时间初始化的(计算机中没有真正的随机......只有伪随机)。 while 循环迭代速度太快,系统时间尚未记录更改。因此,您要重新初始化一个以相同值开头的新 Random 对象。
尝试创建一个在整个方法中重复使用的 Random 对象:
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)