我有两个方法,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;
}
答案 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);
}
}
或者,您可以使成员保持静态。