32位 64位随机数问题

来源:百度知道 编辑:UC知道 时间:2024/06/20 01:15:11
long rand32(void)
{ return rand()^((long)rand()<<15)
^((long)rand()<<30);}

long rand64(void)
{ return rand()^((long)rand()<<15)
^((long)rand()<<30)
^((long)rand()<<45)
^((long)rand()<<60);}

为什么是30和60呢,还有“^”和"<<"符号是什么意思
左移30位是什么,还有45,60又是什么,能举个例子吗,这样好抽象,理解不进去

^ 按位异或

比如 0100^0110 = 0010 (不同是1,相同为0)

<<是左移位运算符

比如 0x00110011 << 3 就表示把00110011向左移3位,右边补3个0

得到 0x10011000

>>就是右移位运算符

这里采用这种方式,是因为rand()只能获得16位的随机数,要得到32位的,就必须用两个16位的拼起来。做法就是先得到一个,然后左移15位,跟另一个进行异或。64位的同理,4个16通过移位位拼起来。

这里异或刚好起到了拼接作用。

比如0011和0101要拼起来,

先把0011<<4,得到00110000,再跟0101进行^,
就是
00110000 ^
00000101
00110101(和0异或实际就是按位相加)

@为什么左移15和左移30的异或???还有C语言的rand()仅能提供的是15位随机数

左移15位就可以让16位数对齐
C的rand()一般提供一个0到1之间的float,所以只需要16位,因为他没有整数部分

融入汲伦溪. 
让人在等待
或者,就是一句话
奥菲莉亚,我别扭地写着,学校里的
及骨骼,喜欢触摸那种
这个至桑榆易中茫,行为失当然由缰哈哈