Random.NextDouble () (Double из диапазона [0.0,1.0)) иногда умножается на большое значение Int64 (пусть Int64 большое = 9000000000L), и результат вычисляется для получения случайного значения Int64 больше, чем может бытьполученный из Random.Next () (Int32 из диапазона [0, Int32.MaxValue)).
Random r = new Random();
long big = 9000000000L;
long answer = (long) (r.NextDouble() * big);
Мне кажется, что общее количество уникальных значений для Double в диапазоне [0.0, 1.0) предоставляет верхнюю границу для числа уникальных Int64, которые он может генерировать.На самом деле, свободная верхняя граница, как много разных двойников, будет отображаться на один и тот же Int64.
Поэтому я хотел бы знать: каково общее количество уникальных значений для двойного в диапазоне [0.0, 1.0)?
Еще лучше, если вы скажете мне, какое наибольшее значение может принимать «большое», чтобы «ответ» мог быть значением из диапазона [0, большое), и является ли распределениеЗначения «answer» одинаковы, если предположить, что Random.NextDouble () одинаков.
Редактировать: Double (double) здесь относится к двойному значению IEEE 754 с плавающей точкой, в то время как Int64 (long) и Int32 (int) относятся к 64-битному и 32-битному дополнению со знаком 2 соответственно.
Вдохновленный этим вопросом: Генерация 10-значного уникального случайного числа в Java
Хотя я использовал C #, этот вопрос не зависит от языка и больше касается дискретной математики, чем программирования,но это беспокоит меня не столько из-за математического любопытства, сколько из-за того, что программист хочет использовать формулу только в том случае, если он делает то, что должен, и с точки зрения безопасности.