我有一个图,每个节点有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;
}
Run Code Online (Sandbox Code Playgroud)
但有时候,Random不能按预期工作."new Random().Next(4)"继续生成0.所以始终是第一个子节点被选择,并且生成一个非常长的重复序列,如node1-> node2-> node1-> node2 ....发生内存不足异常.
有没有办法让Random类正常工作?
Gle*_*hes 12
原因是因为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;
}
Run Code Online (Sandbox Code Playgroud)
初始化外部循环的随机实例,例如:
public List<Node> GetPath(Node begin, Node end)
{
var nodes = new List<Node>();
var node = begin;
var random = new Random();
while (node != end)
{
nodes.Add(node);
var next = node.Children[random.Next(4)];
node = next;
}
nodes.Add(end);
return nodes;
}
Run Code Online (Sandbox Code Playgroud)