#c# #random
#c# #Случайный
Вопрос:
Я ищу способ рандомизировать список с использованием начального значения. Чего я хочу достичь этим, так это контролируемой рандомизации. Другими словами, чтобы убедиться, что список всегда рандомизируется в одном и том же порядке, если я использую для этого одно и то же начальное значение.
В настоящее время я использую этот код:
string arbitrarySeed = "someValue";
System.Random random = new System.Random(BitConverter.ToInt32(Encoding.ASCII.GetBytes(arbitrarySeed), 0));
List<object> randomizedOptions = items?.OrderBy(o => random.Next()).ToList();
Это кажется немного чрезмерно сложным, поэтому я ищу более элегантный способ справиться с этим.
Я знаю, что рандомизация таким образом на самом деле не очень случайна, но мне не нужно, чтобы это была настоящая случайность. Подойдет то, что подходит близко.
Комментарии:
1. Почему вы думаете, что это слишком сложно? Кажется, что самый простой способ сделать то, что вам нужно, это взять string -> создать int seed -> сгенерировать randoms для упорядочивания другого списка.
2. Есть ли причина, по которой вы используете строку в качестве начального числа вместо целого?
3. Ваша чрезмерная сложность заключается в том, что вы не используете целое число напрямую.
4. Обратите внимание, что
BitConverter.ToInt32
будут приниматься только первые 4 байта передаваемого вами массива, поэтому «someValue» и «someValue2» дадут вам одинаковое начальное значение.5. Насколько «согласованным» вам это нужно? Вы могли бы использовать
new System.Random(arbitrarySeed.GetHashCode())
, но это может быть нестабильным в версиях или реализациях .NET.
Ответ №1:
В зависимости от того, насколько «согласованным» вам должен быть сгенерированный ряд, вы могли бы использовать string.GetHashCode
:
string arbitrarySeed = "someValue";
System.Random random = new System.Random(arbitrarySeed.GetHashCode());
List<object> randomizedOptions = items?.OrderBy(o => random.Next()).ToList();
GetHashCode
не гарантируется согласованность между версиями или реализациями .NET (например, Linux, Windows, macOS), но если вам нужна локализованная согласованность, это может сработать для вас.
Также обратите внимание, что BitConverter.ToInt32
займет всего 4 байта передаваемого вами массива, поэтому «someValue» и «someValue2» дадут вам одинаковое начальное значение.