C#Random不像随机一样工作

Rya*_*yan 3 .net c# random

我有一个图,每个节点有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)


Kir*_*huk 5

初始化外部循环的随机实例,例如:

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)