Генерируйте случайные значения в C#

В вашем многомодульном проекте вы обычно используете только одну версию для всех модулей. Это означает, что вы можете определить зависимости между модулями с <version>${project.version}</version>, где свойство ${project.version}$ разрешается во время сборки. Maven собирает все модули в правильном порядке.

32
задан Noldorin 24 March 2009 в 13:33
поделиться

8 ответов

Это должно добиться цели. (Это - дополнительный метод так, чтобы можно было назвать его, как Вы называете нормальное Next или NextDouble методы на a Random объект).

public static Int64 NextInt64(this Random rnd)
{
    var buffer = new byte[sizeof(Int64)];
    rnd.NextBytes(buffer);
    return BitConverter.ToInt64(buffer, 0);
}

Просто замена Int64 с UInt64 везде, если Вы хотите целые числа без знака вместо этого, и все должны хорошо работать.

Примечание: Так как никакой контекст не был обеспечен относительно безопасности или желаемой случайности сгенерированных чисел (на самом деле OP, конкретно упомянутый Random класс), мой пример просто имеет дело с Random класс, который является предпочтительным решением, когда случайность (часто определяемый количественно как информационная энтропия) не является проблемой. Как интерес, см. другие ответы то упоминание RNGCryptoServiceProvider (RNG, обеспеченный в System.Security пространство имен), который может использоваться почти тождественно.

74
ответ дан Noctis 27 November 2019 в 19:44
поделиться

Использовать Random.NextBytes() и BitConverter.ToInt64 / BitConverter.ToUInt64.

// Assume rng refers to an instance of System.Random
byte[] bytes = new byte[8];
rng.NextBytes(bytes);
long int64 = BitConverter.ToInt64(bytes, 0);
ulong uint64 = BitConverter.ToUInt64(bytes, 0);

Отметьте то использование Random.Next() дважды, смещая одно значение и затем осуществление операции ИЛИ/добавление не работает. Random.Next() только производит неотрицательные целые числа, т.е. это генерирует 31 бит, не 32, таким образом, результат двух вызовов только производит 62 случайных бита вместо 64 битов, требуемых покрывать полный спектр Int64/UInt64. (Ответ Guffa показывает, как сделать это с тремя вызовами к Random.Next() все же.)

29
ответ дан Community 27 November 2019 в 19:44
поделиться

Здесь Вы идете, это использует crytpo сервисы (не Случайный класс), который является (теоретически) лучшим RNG затем Случайный класс. Вы могли легко сделать это расширением Случайных или сделать Ваш собственный Случайный класс, где RNGCryptoServiceProvider является объектом уровня класса.

using System.Security.Cryptography;
public static Int64 NextInt64()
{
   var bytes = new byte[sizeof(Int64)];    
   RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();
   Gen.GetBytes(bytes);    
   return BitConverter.ToInt64(bytes , 0);        
}
9
ответ дан Muad'Dib 27 November 2019 в 19:44
поделиться

Можно использовать сдвиг разряда для соединения случайного числа на 64 бита от случайных чисел на 31 бит, но необходимо использовать три числа на 31 бит для получения достаточного количества битов:

long r = rnd.Next();
r <<= 31;
r |= rnd.Next();
r <<= 31;
r |= rnd.Next();
6
ответ дан Guffa 27 November 2019 в 19:44
поделиться

Я всегда использую это для получения моего случайного семени (проверка ошибок, удаленная для краткости):

m_randomURL = "https://www.random.org/cgi-bin/randnum?num=1&min=1&max=1000000000";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(m_randomURL);
StreamReader stIn = new StreamReader(req.GetResponse().GetResponseStream());
Random rand = new Random(Convert.ToInt32(stIn.ReadToEnd()));

random.org использует атмосферные помехи для генерации случайности и по-видимому используется для лотерей и такого.

5
ответ дан sipwiz 27 November 2019 в 19:44
поделиться

Вы не говорите, как Вы собираетесь использовать эти случайные числа... имеют в виду, что значения, возвращенные Случайным, не "криптографически безопасны", и они не должны использоваться для вещей, включающих (большие) секреты или (много из) деньги.

3
ответ дан Ðаn 27 November 2019 в 19:44
поделиться

Вы могли создать a byte массив, заполните его случайными данными и затем преобразуйте его в long (Int64) и ulong (UInt64).

byte[] buffer = new byte[sizeof(Int64)];
Random random = new Random();

random.NextBytes(buffer);
long signed = BitConverter.ToInt64(buffer, 0);

random.NextBytes(buffer);
long unsigned = BitConverter.ToUInt64(buffer, 0);
1
ответ дан Samuel 27 November 2019 в 19:44
поделиться
Random r=new Random();
int j=r.next(1,23);
Console.WriteLine(j);
-3
ответ дан thkala 27 November 2019 в 19:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: