需要使用AND或XOR NEG SHIFT NOT等进行算法(公式,函数),该算法根据索引来计算数组的元素,
元素的大小是一个字节
例如element = index^constant
,其中常数为array[index]^index
(先前计算)。
仅在数组大小小于256的情况下才有效。
当索引大于1个字节时,如何从索引中创建一个字节。
制作一个公式,将数组的索引转换为此索引处的ement(byte)
•
问答
chensiduan 回答:制作一个公式,将数组的索引转换为此索引处的ement(byte)
以相同的方式进行重复,因为您在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]
是不可能的……