需要使用AND AND XOR NEG SHIFT NOT等算法来创建算法(公式,函数),该算法根据索引来计算数组的元素,元素的大小是一个字节例如element = index^constant
其中常数为array[index]^index
(先前计算)。仅在数组大小小于256的情况下才有效。当索引大于1个字节时,如何从索引中生成一个字节。
但是,由于您在BYTE中只有256个可能的数字,因此将存在重复,因此如果您的数组大于256,则必须存在重复。
为了避免明显的镜像,例如,您不能使用单调函数
value[ix] = ix
是单调的,因此将被视为类似于每256个字节镜像数组内容的形状。为了避免这种情况,您需要将更多的东西组合在一起。它类似于计算自己的伪随机生成器。常用方法是:
模块化算术
类似:
value[ix]=( ( c0*ix + c1*ix*ix + c2*ix*ix*ix )%prime )&255
如果常量c0,c1,c2
和prime
足够大,则输出看起来是随机的,因此在输出中可见的重复模式会少得多……但是您需要使用可以容纳质数的位宽算法...] >
如果您达到算术位宽的上限,则需要使用modmul,modpow
以避免溢出。参见:
交换位
只需在ix
上做一些数学运算,在此您还使用带有交换位的ix。这将极大地改变单调性...这种方法最有效,但是在累积子结果上却不然,这不是您的情况。我会尝试:
value[ix]=( 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?
毕竟这不可能从ix
中获得value[ix]
...