Random 离散均匀分布的非递归伪随机数生成

Random 离散均匀分布的非递归伪随机数生成,random,hash,Random,Hash,我想知道是否有廉价有效的函数可以通过索引生成伪随机数?通过类似的实现: var rand = new PseudoRandom(seed); // all sequences for same seeds are equal trace(rand.get(index1)); // get int number by index1, for example =0x12345678 trace(rand.get(index2)); ... trace(rand.get(index1)); // mu

我想知道是否有廉价有效的函数可以通过索引生成伪随机数?通过类似的实现:

var rand = new PseudoRandom(seed); // all sequences for same seeds are equal
trace(rand.get(index1)); // get int number by index1, for example =0x12345678
trace(rand.get(index2));
...
trace(rand.get(index1)); // must return the SAME number, =0x12345678

可能这不是关于随机性,而是关于良好(快速且尽可能接近均匀分布)散列,其中初始种子用作盐。

您可以用流密码Salsa20构建这样的随机数生成器。Salsa20的一个很好的特性是,您可以非常便宜地跳转到任何偏移量。Salsa20速度很快,通常每个字节少于20个周期。由于密码与真正的随机流无法区分,因此一致性应该非常好

由于您可能不需要加密安全的随机数,您甚至可以将轮数减少到8轮,而不是通常的20轮

另一种选择是使用Salsa20背后的思想,即如何混合状态数组(Bernstein称之为哈希函数),来构建自己的随机数生成器