制作一个公式,将数组的索引转换为此索引处的ement(byte)

需要使用AND或XOR NEG SHIFT NOT等进行算法(公式,函数),该算法根据索引来计算数组的元素, 元素的大小是一个字节 例如element = index^constant,其中常数为array[index]^index(先前计算)。 仅在数组大小小于256的情况下才有效。 当索引大于1个字节时,如何从索引中创建一个字节。

chensiduan 回答:制作一个公式,将数组的索引转换为此索引处的ement(byte)

以相同的方式进行重复,因为您在BYTE中只有256个可能的数字,因此,如果您的数组大于256,则必须重复。

为避免明显的镜像,您不能使用例如单调函数

value[ix] = ix

是单调的,因此会像形状一样每256个字节镜像数组的内容。为了避免这种情况,您需要将更多的东西组合在一起。它类似于计算自己的伪随机生成器。常用的方法是:

  1. 模块化算术

    类似:

    value[ix]=( ( c0*ix + c1*ix*ix + c2*ix*ix*ix )%prime )&255
    

    如果常量c0,c1,c2prime足够大,则输出看起来是随机的,因此在输出中可见的重复模式会少得多……但是您需要使用可以容纳素...

    如果您要达到算术位宽的上限,则需要使用modmul,modpow以避免溢出。参见:

  2. 交换位

    只需在您的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]是不可能的……

本文链接:https://www.f2er.com/3006999.html

大家都在问