需要做一个使用AND OR XOR NEG SHIFT NOT等的算法(公式,函数),它从一个索引计算数组的元素,元素的大小是一个字节,例如element = index^constant
,其中常量是array[index]^index
(先前计算的)。仅当数组大小小于256时,此方法才有效。如何在索引大于1字节时从索引中生成一个字节。
发布于 2019-11-30 10:22:07
然而,同样的方式也会有重复,因为你只得到了256个字节的可能数字,所以如果你的数组大于256,那么肯定有重复的。
为了避免明显的镜像,您不能使用单调函数,例如
value[ix] = ix
是单调的,所以它看起来像是每256个字节镜像数组内容的形状。为了避免这种情况,你需要将更多的东西组合在一起。它类似于计算自己的伪随机生成器。通常的方法是:
类似于:
valueix=( ( c0*ix + c1*ix*ix + c2*ix*ix*ix )%质数)&255
如果常量c0,c1,c2
和prime
足够大,则输出看起来是随机的,因此输出中可见的重复模式会少得多……但是你需要使用可以容纳质数的位数的算术...
如果你达到了算术位宽的上限,那么你需要使用modmul,modpow
来避免溢出。请参阅:
- [Modular arithmetics and NTT (finite field DFT) optimizations](https://stackoverflow.com/q/18577076/2521214)
只需在您的ix
上做一些数学运算,您也可以使用带交换的位的ix。这将极大地改变单调属性。然而,这种方法在累积子结果上效果最好,而您的情况并非如此。我会尝试:
valueix=( ix + ((ix<<3)*5) - ((ix>>2)*7) +((3*ix)^((ix<<4)||(ix>>4 )&255
使用常量和运算符可以得到不同的结果。但是,使用这种方法时,您需要检查有效性(我没有!)。因此为前几个值(如1024)渲染图形,其中x
轴为ix
,y
轴为value[ix]
。在那里,你应该看看这个东西是否在重复,或者甚至是饱和到某个值,如果是,改变方程。
有关更多信息,请参阅How to seed to generate random numbers?
在所有这一切之后,不可能从value[ix]
获得ix
...
https://stackoverflow.com/questions/59106131
复制