我被要求使用以下算法创建一个伪随机数生成器:
生成器将生成从
1到N-1的每一个整数,这正是N=2^n算法的一次。
R初始化为等于1,然后在每次连续调用随机数时:R=R*5n+2位外的所有产品,并将结果放入R中。p=R/4当它说屏蔽除低阶n+2位外的所有产品时,该算法意味着什么?
发布于 2011-07-06 05:00:26
对于n=1,你会掩蔽最少的3位
假设大端你有这个位布局
128 64 32 16 8 4 2 1
X X X X X O O OO是您想要保留的位元,您将使用值为7的位和运算符,因为您需要4、2和1位高来掩蔽(按位和)位。myProduct &= 0x07; // force all bits except the 3 least to be 0
发布于 2011-07-07 04:18:52
下面是一个有用的示例,使用Python解释器帮助进行二进制转换
>>> bin(1234567)
'0b100101101011010000111'假设n=4,那么除了最后的6位之外,我需要掩蔽所有的内容。哪个应该给
>>> n=4
>>> 0b000111
7维基百科的二进制页面有一些关于按位操作的信息。在这里,我们对和操作感兴趣
>>> 1234567 & 0b111111
7达到这个掩码的一种方法是计算一个更大的数字(因为它是2的幂),然后从它中减去一个。
>>> (1<<n+2)-1
63
>>> bin(63)
'0b111111'(1<<n+2)-1可以简化为(4<<n)-1,但在本例中还有另一种方法
>>> 1234567 % (4<<n)
7我将按位和(&)替换为模数(%),它具有掩蔽最低n+2比特的相同效果。
模数对CPU的工作量略大于按位运算,因此,如果需要最佳性能,则应使用按位方法。
https://softwareengineering.stackexchange.com/questions/90710
复制相似问题