其实,我有几个交织问题。 (如果它很重要,我使用C#)。缩放Int内统一的随机范围变成双数
首先。我有一个在UInt32范围内产生随机数的prng,从0到UInt32.Max(含)。我想尽可能保持一致性。 (a,b),双重范围(如[0,1],[0,1),(0,1),[-2,4],( - 10,10))?
我很关心以下内容。我有4 294 967 296个成果。它小于[0,1]的双数范围中的数字 - 2^53。所以我从2位数字构造了4 294 967 296-ary数字,这在[0,4294967295 * 4294967296 + 4294967295]中是随机的和统一的。这个最大值大于1^2^53,所以如果有人把它扔掉了,重新计算,使用mod 2^53并且得到统一的数字,例如[0,1]。在这里,我必须将最大值表示为double(假设没有Int64类型) - 它有没有什么缺点?现在,如果我想得到[0,1),我认为结果的数目是(2^53) - 1。加上最后的结果1 /(2^53)将产生随机双0,1]。为了得到(0,1),我考虑(2^53) - 2个新的结果并将1 /(2^53)加到0为基础的结果。得到接近或等于整个双倍范围的双倍范围?即使我构造如上所述的n元数,它可能会变得比Double.Max大。可能有些位移/位掩码方法有可能吗?
其次。现在在[0,1)中有双重结果,可以得到[Double.Min,Double.Max]范围吗?有多少个双数?如果有完整的双倍范围prng,获得UInt范围的最佳方式是什么?直接映射或直接映射到[0,1]之前?
三。我发现这个代码(http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c):
/* generates a random number on [0,1) with 53-bit resolution*/
double genrand_res53(void)
{
unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6;
return(a*67108864.0+b)*(1.0/9007199254740992.0);
}
为什么A和B转移到5和6,为什么之后a * 67108864.0 + b是统一的?
谢谢。