Мне нужно семя для экземпляра класса C # Random
, и я читал, что большинство людей используют для этого счетчик тиков текущего времени. Но это 64-битное значение, и начальное значение должно быть 32-битным. Теперь я подумал, что метод GetHashCode()
, который возвращает int
, должен предоставлять разумно распределенное значение для своего объекта, и это можно использовать, чтобы избежать использования только младших 32 бита счетчика тиков. Однако я не смог найти ничего о GetHashCode () для типа данных Int64
.
Итак, я знаю, что это не имеет большого значения, но будет ли следующая работа работать так же хорошо, как я думаю (я не могу использовать случайность методом проб и ошибок), или, может быть, она работает так же, как использование (int)DateTime.Now.Ticks
в качестве начального числа ? А может еще хуже работает? Кто может пролить свет на это.
int seed = unchecked(DateTime.Now.Ticks.GetHashCode());
Random r = new Random(seed);
Изменить: зачем мне семя и не позволять конструктору Random()
делать свою работу? Мне нужно отправить семя другим клиентам, которые используют то же семя для той же случайной последовательности.
3 ответа
new Random()
уже использует текущее время. Это эквивалентно new Random(Environment.TickCount)
.
Но это деталь реализации, которая может измениться в будущих версиях .net.
Я бы рекомендовал использовать new Random () и предоставлять фиксированное начальное число только в том случае, если вы хотите получить воспроизводимую последовательность псевдослучайных значений.
Поскольку вам нужно известное семя, просто используйте Environment.TickCount
, как это делает MS. А затем передать его другим экземплярам программы в качестве начального числа.
Если вы создаете несколько экземпляров Random
за короткий интервал (может быть 16 мс), они могут быть засеяны до одного и того же значения и, таким образом, создать одну и ту же псевдослучайную последовательность. Но это, скорее всего, не проблема. Эта распространенная ошибка возникает из-за того, что окна обновляют текущее время (DateTime.Now
/ .UtcNow
) и TickCount (Environment.TickCount
) только каждые несколько миллисекунд. Точный интервал зависит от версии Windows и других запущенных программ. Типичные интервалы, когда они не меняются, составляют 16 мс или 1 мс.
new Random()
, но мне нужно семя.
Если вам нужно засеять его чем-то другим, кроме текущего времени (в этом случае вы можете использовать конструктор по умолчанию), вы можете использовать это:
Random random = new Random(Guid.NewGuid().GetHashCode());
DateTime.Now.Ticks.GetHashCode()
?
DateTime.Now
изменяется только каждые несколько миллисекунд. При использовании этого метода очень маловероятно, что два экземпляра random получат одно и то же начальное число даже при быстрой инициализации.
Random random = new Random(Guid.NewGuid().GetHashCode() & int.MaxValue);
Чтобы убедиться, что вы отправляете только положительные целые числа.
У меня был аналогичный вопрос, чтобы выбрать случайный набор вопросов из большего списка вопросов. Но когда я использую время в качестве начального числа, оно дает то же случайное число.
Итак, вот мое решение.
int TOTALQ = 7;
int NOOFQ = 5;
int[] selectedQuestion = new int[TOTALQ];
int[] askQuestion = new int[NOOFQ];
/* Genarae a random number 1 to TOTALQ
* - if that number in selectedQuestion array is not o
* - Fill askQuestion array with that number
* - remove that number from selectedQuestion
* - if not re-do that - - while - array is not full.
*/
for (int i = 0; i < TOTALQ; i++) // fill the array
selectedQuestion[i] = 1;
int question = 0;
int seed = 1;
while (question < NOOFQ)
{
DateTime now1 = new DateTime();
now1 = DateTime.Now;
Random rand = new Random(seed+now1.Millisecond);
int RandomQuestion = rand.Next(1, TOTALQ);
Response.Write("<br/> seed " + seed + " Random number " + RandomQuestion );
if (selectedQuestion[RandomQuestion] != 0)
{
selectedQuestion[RandomQuestion] = 0; // set that q =0 so not to select
askQuestion[question] = selectedQuestion[RandomQuestion];
Response.Write(". Question no " + question + " will be question " + RandomQuestion + " from list " );
question++;
}
seed++;
}
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.