C#随机不像随机那样工作 [英] C# Random does not work like a random

查看:50
本文介绍了C#随机不像随机那样工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆