2015-01-11 2 views
-2

Я пишу приложение для игры в мелочи в C#, где пользователь должен выбрать 5 случайно выбранных мелочей из набора из 20 доступных вопросов.Как я могу гарантировать, что одинаковые случайные числа не будут выбраны каждый раз в C#?

Я использую этот код для создания индекса, что приложение будет использовать для выборки вопросов:

private void GenerateRandomNumbers(int RandomIndex) 
    { 
     Random rand = new Random(); 
     HashSet<int> check = new HashSet<int>(); 
     for (int i = 1; i < RandomIndex; i++) 
     { 
      int curValue = rand.Next(1, RandomIndex); 
      while (check.Contains(curValue)) 
      { 
       curValue = rand.Next(1, RandomIndex); 
      } 
      ChosenQuestions.Add(Questions[curValue]); 

      check.Add(curValue); 
     } 
     check.Clear(); 
    } 

Проблема заключается в том, что, когда пользователь играет в игру во второй раз (нажав на кнопку «ИГРАТЬ СНОВА»), и вышеуказанный код выполняется снова, он продолжает выбирать одинаковые случайные числа, хотя они не обязательно в одном порядке. это заставляет выбирать одинаковые мелочи. Я хочу новый новый набор абсолютно случайных чисел каждый раз, когда выполняется вышеуказанный код. Как я могу изменить код, чтобы выполнить это?

ПРИМЕЧАНИЕ. Я скопировал этот код из другого места здесь, в Stack Overflow, так что это не мой собственный оригинальный код.

+0

Конечно, он выбирает те же номера, что и у одного и того же диапазона, и вы проверяете, содержится ли это число, и если вы его снова генерируете ?! – Hristo

+0

Если вы хотите, чтобы другое значение определяло другой диапазон. – Hristo

+0

Если вы не измените значение RandomIndex между двумя вызовами, вы всегда получите случайное число между 1 и RandomIndex.Я предлагаю передать также нижний предел – Steve

ответ

-2

Вы могли сид ГСЧ с различными семенами

Random rand = new Random(newSeed); 

Семя может быть взято из текущего времени, например

-2

Попробуйте использовать только один глобальный Random объекта, а не создавая new Random() каждый раз, когда пьесы пользователя , Это гарантирует, что каждый раз инициализирует новое семя, числа будут представлять собой последовательность, созданную одним семенем. Это приблизит их к реальной случайности.

+0

Хотя это проблема с кодом, это не источник проблемы OP. Существует недостаток в диапазоне для выбора случайных значений. –

1

Предполагая, что RandomIndex - это количество значений для выбора. Вы хотите:

rand.Next(1, RandomIndex); 

быть

rand.Next(0, Questions.Length); 

Существует совсем одна ошибка в цикле, а также. Давайте просто исправить все это:

private void GenerateRandomNumbers(int RandomIndex) 
{ 
    Random rand = new Random(); 
    HashSet<int> check = new HashSet<int>(); 
    for (int i = 0; i < RandomIndex; i++) 
    { 
     int curValue = rand.Next(0, Questions.Length); 
     while (check.Contains(curValue)) 
     { 
      curValue = rand.Next(0, Questions.Length); 
     } 
     ChosenQuestions.Add(Questions[curValue]); 
     check.Add(curValue); 
    } 
} 

Кроме того, если вы звоните это в тугой петле, вы получите то же значение, выбрало несколько раз. Это потому, что Random выбирает семя, основанное на системных часах, которые только перестраиваются каждые 15 мс или около того.

Я думаю, что лучше использовать подход shuffle, а не проверять, были ли уже выделены индексы.

0

Начальник кодирования, вы ближе всего к пониманию моей проблемы. Скажем, у меня тривиальная игра с 50 вопросами. Пользователь решает играть только в 5 вопросов. Это означает, что 5 вопросов выбираются случайным образом из 50. Кроме того, «Вопросы», как в «Вопросах». Линия - это фактически список, поэтому я написал Questions.Count() для верхнего предела диапазона. Я переписал код следующим образом:

private void GenerateRandomNumbers(int RandomIndex) 
    { 
     Random rand = new Random(); 
     HashSet<int> check = new HashSet<int>(); 
     for (int i = 0; i < RandomIndex; i++) 
     { 
      int curValue = rand.Next(0, Questions.Count()); 
      while (check.Contains(curValue)) 
      { 
       curValue = rand.Next(0, Questions.Count()); 
      } 
      ChosenQuestions.Add(Questions[curValue]); 
      check.Add(curValue); 
     } 
    } 

К сожалению, те же 5 вопросов по-прежнему выбираются из 50 каждый раз.

Смежные вопросы