Possible Duplicate:
Random number generator only generating one random number




我的工作中有一种方法可以通过在一组单词之间随机选择来生成句子,如下所示:

private string generateTest(string test)
{
    test = test.ToLower();
    string sentence = "";
    for (int c = 0; c < 30; c++)
    {
        Random r = new Random();
        int len = r.Next(3, 7);
        string word = "";
        for (int i = 0; i < len; i++)
        {
            word += test[r.Next(0, test.Length)];
        }
        sentence += word + ' ';
    }
    return sentence;
}


但是,问题在于在随机生成前6个单词之后,所有后续生成都是完全相同的。例如


  aqaaaz,qqzaq,aqqza,azqq,aazzq,aqqa,azzzq,azzzq,azzzq,azzzq,
  azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,azzzq,
  azzzq,azzzq,azzzq,azzzq,azzzq ....


然后,即使我重新启动程序,也是如此。我认为这是.NET Runtime在做一些自动优化。谁能解释得更好?我如何解决这个问题?

最佳答案

您正在为循环的每个周期生成实例。将您的代码更改为:

Random r = new Random();
for (int c = 0; c < 30; c++)
{
...


另外,您可能想为其分配有意义的种子。现在,您没有将任何东西传递给构造函数,如果您重新创建相同的实例,这可能会产生并非真正随机的结果。

编辑:正如影子向导正确指出的那样,给它相同的种子会产生相同的结果。当我说“有意义的种子”时,我暗示的东西具有随机或伪随机属性。有many种方法可以产生更加不可预测的结果,但是要解决您的问题,将实例移出周期-或将其实例化为包含类的成员就足够了。您选择种子还是RNG应该取决于您的要求。

关于c# - 随机对象在后续调用中变为非随机对象? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14320874/

10-12 15:05