Как создать криптографически безопасный Double между 0 и 1?

Я знаю, как сгенерировать случайное число от 0 до 1, используя NextDouble метод генератора псевдослучайных чисел.

var rng1 = new System.Random();
var random1 = rng1.NextDouble(); // generates a random double between 0 and 1.0

И я знаю, как заполнить массив случайных байтов, используя криптографически безопасный генератор случайных чисел.

Byte[] bytes = new Byte[8];
var rng2 = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng2.GetBytes(bytes); // generates 8 random bytes

Но как я могу преобразовать вывод массива байтов в RNGCryptoServiceProvider в случайное число, равномерно распределенное между 0 (включительно) и 1 (исключительно)?

12 голосов | спросил Portman 18 Mayam10 2010, 07:45:39

2 ответа


0

Мне кажется, что решения пока будут иметь неравномерное распределение из-за обратного. Для равномерного распространения я думаю, что вы хотите что-то вроде этого.

// Step 1: fill an array with 8 random bytes
var rng = new RNGCryptoServiceProvider();
var bytes = new Byte[8];
rng.GetBytes(bytes);
// Step 2: bit-shift 11 and 53 based on double's mantissa bits
var ul = BitConverter.ToUInt64(bytes, 0) / (1 << 11);
Double d = ul / (Double)(1UL << 53);

Обратите внимание, что вы не можете просто разделить UInt64 на UInt64.MaxValue, потому что двойному не хватает битов, и нет способа получить уникальные выходные данные для всех ваших входов. Таким образом, вы можете /должны выбросить немного битов.

ответил Conrad Albrecht 18 Mayam10 2010, 08:50:19
0

Ну, я бы не назвал 64-битное случайное число «криптографически безопасным» - вы бы хотели, чтобы намного больше битов было «криптографически безопасным». Но в любом случае вы могли бы сделать что-то вроде этого:

var bytes = // assume this contains 8 bytes of random numbers

long l = BitConverter.ToInt64(bytes);
double d = Math.Abs(1 / (double)l);
ответил Dean Harding 18 Mayam10 2010, 07:49:44

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132