C # Метод не возвращает уникальное значение, когда оно должно быть - PullRequest
1 голос
/ 07 марта 2011

У меня есть два метода, generateNounPhrase () и generateVerbPhrase ().VerbPhrase будет вызывать NounPhrase половину времени, и на его выходе выходные данные должны выглядеть примерно так:

пустой лот реанимирует эту пирамиду

(жирным шрифтом указано, где логически вызывается generateNounPhrase ()).Истинный вывод, однако, имеет вид:

пустой лот реанимирует пустой лот

AtСначала я подумал, что мой метод 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 ]

4 голосов
/ 07 марта 2011

Не видя код для randomIndex, я не могу быть уверен, но кажется, что вы, вероятно, создаете новый экземпляр класса Random каждый раз, когда вызываете randomIndex.Если вы сделаете это дважды за очень короткое время, как это было бы здесь, он запустит генератор случайных чисел с одинаковым значением оба раза (потому что он засеян с текущим временем), и вы получите одно и то же «случайное» числовозвращается оба раза.

Вместо этого вы должны использовать один экземпляр Random для всех вызовов randomIndex.

1 голос
/ 07 марта 2011

Я очень подозреваю, что ваш метод 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);
   }
}

В качестве альтернативы, вы можете сделать члены статическими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...