生成一个64位整数的均匀分布

我在用着

var crypto = require('crypto'); var uid = crypto.pseudoRandomBytes(8); 

生成64位的ID。

我不需要这些是真正的随机,但我希望他们均匀分布在0ffffffffffffffff之间。 但是,他们不是。 以这种方式生成1,000,000个64位整数:

 var bignum = require('bignum'); var crypto = require('crypto'); var randomBignum = function() { return bignum.fromBuffer(crypto.pseudoRandomBytes(8)); } var avg = randomBignum(); var avg_len = avg.bitLength(); var lengths = {}; for (var i = 0; i < 1e6; i++) { var big = randomBignum(); avg = avg.add(big).div(2); var length = big.bitLength(); if (typeof lengths[length] === 'undefined') { lengths[length] = 0; } lengths[length] += 1; avg_len = (avg_len + length) / 2; } console.log('Average integer: %s', avg); console.log('Average bit length: %s', avg_len); console.info('Bit length distribution: %s', require('util').inspect(lengths)); 

生产:

 Average integer: 8386866841744540769 Average bit length: 63.11672078688376 Bit length distribution: { '45': 1, '47': 2, '48': 7, '49': 15, '50': 23, '51': 66, '52': 114, '53': 248, '54': 521, '55': 955, '56': 1905, '57': 4019, '58': 7742, '59': 15552, '60': 31396, '61': 63048, '62': 125182, '63': 249271, '64': 499933 } 

我可能对这里的统计信息感到困惑,但是这些统计数据并不是均匀分布的,对吗? 每个字节都是单独随机生成的事实使得不可能生成连续的0字节,所以你得到的指数小的数字就less了。

在Node中生成均匀分布的64位ID的好方法是什么? 我应该使用Math.random并将结果乘以ffffffffffffffff

他们(可能) 统一的! 获得0的概率与获得18446744073709551615的概率相同,但是在该范围中有4611686018427387904个数字,没有前导零,并且只有一个64个。 你应该期望看到每个比特的数量大约是前一个比特的两倍,这与你的testing一致。