C# C方法在应该返回唯一值时不返回唯一值
我有两种方法,generateUnphrase和generateVerbPhrase。VerbPhase将在一半时间内调用名词短语,其输出应为以下内容: 空地块将重新设置此金字塔的动画 粗体表示在逻辑上调用generateNounPhrase的位置。然而,真实输出的形式为: 空地块将重新设置空地块的动画 起初我认为我的randomIndex方法并没有像我预期的那样有效,但如果我再次运行这两种方法,我确实会得到不同的名词短语,但它们在句子的开头和结尾并不是唯一的 你知道为了得到一种方法来显示相同的结果,我做错了什么吗C# C方法在应该返回唯一值时不返回唯一值,c#,methods,C#,Methods,我有两种方法,generateUnphrase和generateVerbPhrase。VerbPhase将在一半时间内调用名词短语,其输出应为以下内容: 空地块将重新设置此金字塔的动画 粗体表示在逻辑上调用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;
}
在没有看到randomIndex的代码的情况下,我无法确定,但每次调用randomIndex时,您可能都在创建Random类的新实例。如果你在很短的时间内做两次,就像你在这里做的那样,它会用相同的值对随机数生成器进行两次播种,因为它是用当前时间播种的,你会得到两次返回的相同的“随机”数
相反,您应该为所有randomIndex调用使用一个Random实例。如果没有看到randomIndex的代码,我不能确定,但是每次调用randomIndex时,您可能都在创建Random类的新实例。如果你在很短的时间内做两次,就像你在这里做的那样,它会用相同的值对随机数生成器进行两次播种,因为它是用当前时间播种的,你会得到两次返回的相同的“随机”数
相反,您应该为所有randomIndex调用使用一个Random实例。我高度怀疑您的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);
}
}
或者,您可以将成员设置为静态。我高度怀疑您的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);
}
}
或者,您可以将成员设置为静态。您说得对,我正在创建一个新实例,所有这些都是在单击一个按钮后发生的,因此它将在毫秒内非常接近。当我回来工作的时候,我会按照你的建议去做,然后再看一遍代码。工作很愉快。非常感谢你!你是对的,我正在创建一个新实例,所有这些都是在点击一个按钮后发生的,所以它将在毫秒内非常接近。当我回来工作的时候,我会按照你的建议去做,然后再看一遍代码。工作很愉快。非常感谢你!