, , , :
long asLong = BitConverter.ToInt64(myTrulyRandomBytes, 0);
double number = (double)(asLong & long.MaxValue) / long.MaxValue;
ulong double , , :
vxorps xmm0,xmm0,xmm0
vcvtsi2sd xmm0,xmm0,rcx ; interpret ulong as long and convert it to double
test rcx,rcx ; add fixup if it was "negative"
jge 000000000000001D
vaddsd xmm0,xmm0,mmword ptr [00000060h]
vdivsd xmm0,xmm0,mmword ptr [00000068h]
:
vxorps xmm0,xmm0,xmm0
vcvtsi2sd xmm0,xmm0,rcx
vdivsd xmm0,xmm0,mmword ptr [00000060h]
x64 JIT .NET 4, , ulong double.
, : 2 62 0.0 1.0 , , .
, , ulong 1,0 , . , 1.0, ( . , , ):
long asLong = BitConverter.ToInt64(myTrulyRandomBytes, 0);
double number = (double)(asLong & long.MaxValue) / ((double)long.MaxValue + 1);
( )
long asLong = BitConverter.ToInt64(myTrulyRandomBytes, 0);
double number = (double)(asLong & long.MaxValue) * 1.08420217248550443400745280086994171142578125E-19;
ulong, .
, double -bits, .
- /, ( ), , ( , 0, ).
, a double . 0 1, , 1 2, 1.
, , :
x &= (1L << 52) - 1;
( 1.0 - 2.0, 2)
x |= 0x3ff0000000000000;
1:
return BitConverter.Int64BitsToDouble(x) - 1;
. , , 52, 53. ( ).
, .
(u) (u) , , , . , ( ), () : ( )

" " , . , , .
Top - , , , (u) . , (u) longs . , "" .
- , , ( 0,5 1,0) , , , " ". - , .
NextDouble System.Random int 0.0.. 1.0. , , , . int, int.MaxValue 1/(2 31 -1) ( , ), 33 , - .
int.MaxValue , - , NextDouble , , :
const double scale = 4.6566128752458E-10;
double prev = 0;
Dictionary<long, int> hist = new Dictionary<long, int>();
for (int i = 0; i < int.MaxValue; i++)
{
long bits = BitConverter.DoubleToInt64Bits(i * scale - prev);
if (!hist.ContainsKey(bits))
hist[bits] = 1;
else
hist[bits]++;
prev = i * scale;
if ((i & 0xFFFFFF) == 0)
Console.WriteLine("{0:0.00}%", 100.0 * i / int.MaxValue);
}