C#方法应该不返回唯一值

时间:2011-03-06 23:48:11

标签: c# methods

我有两个方法,generateNounPhrase()和generateVerbPhrase()。 VerbPhrase会在一半的时间内调用NounPhrase,它的输出输出应该是这样的结果:

  

空地重新动画此金字塔

(粗体表示逻辑上调用generateNounPhrase()的位置)。然而,真正的输出形式为:

  

空地重新动画空地

起初我以为我的randomIndex方法没有按照我的意图工作,但是如果我再次运行这两种方法,我会得到不同的名词短语,但它们在句子的开头和结尾都不是唯一的,因为它们应该是

知道我做错了什么才能让一个方法显示相同的结果?

private string generateNounPhrase()
{
    string nounPhraseString = "";
    nounPhraseString = nounMarkersStringList[randomIndex(0,nounMarkersStringList.Count-1)];
    if (included(1, 4, 2) == true)
    {
        nounPhraseString += " " + adjectivesStringList[randomIndex(0, adjectivesStringList.Count - 1)];
    }
    nounPhraseString += " " + nounsStringList[randomIndex(0, nounsStringList.Count - 1)];
    return nounPhraseString;
}

private string generateVerbPhrase()
{
    string verbPhraseString = "";
    if (included(1, 4, 2) == true)
    {
        verbPhraseString = intransitiveVerbsStringList[randomIndex(0, intransitiveVerbsStringList.Count - 1)];
    }
    else
    {
        verbPhraseString = transitiveVerbsStringList[randomIndex(0, transitiveVerbsStringList.Count - 1)] + " " + generateNounPhrase();
    }
    return verbPhraseString;
}

2 个答案:

答案 0 :(得分:4)

没有看到randomIndex的代码,我无法确定,但似乎你可能每次调用randomIndex时都会创建一个新的Random类实例。如果你在非常短的时间内完成这两次,就像你在这里一样,它会为随机数生成器播种两次相同的值(因为它是用当前时间播种的),你会得到相同的'随机'数字两次都回来了。

相反,您应该为所有randomIndex调用使用单个Random实例。

答案 1 :(得分:1)

我非常怀疑你的randomIndex方法会产生以下影响:

Random r = new Random();
return r.Next (0, max);

上述代码的问题在于,当您在不同时间运行它时,它会返回不同的值。但是如果你像下面那样运行它,它几乎总是返回相同的值:

Console.WriteLine ("{0} == {1}?", randomIndex(0,10), randomIndex(0,10));

这是因为随机数发生器使用当前时间作为其种子。 2个随机化器同时创建,将始终返回相同的值。正确的方法是:

class MyRand  // Assuming MyRand is the class name
{
   private Random r = new Random();
   public int GetRand(int min, int max)
   {
       return r.Next(min, max);
   }
}

或者,您可以使成员保持静态。