我有使用从互联网上下载的左反馈移位寄存器生成随机数的代码:
#define POLY_MASK_32 0xB4BCD35C
#define POLY_MASK_31 0x7A5BC2E3
#include <iostream>
typedef unsigned int uint;
uint lfsr32, lfsr31;
int shift_lfsr(uint *lfsr, uint polymonial_mask)
{
int feedback;
feedback = *lfsr & 1;
*lfsr >>= 1;
if (feedback == 1)
*lfsr ^= polymonial_mask;
return *lfsr;
}
void init_lfsrs(void)
{
lfsr32 = 0xABCDE; //seed values
lfsr31 = 0x23456789;
}
int get_random(void)
{
/*this random number generator shifts the 32-bit LFSR twice before XORing
it with the 31-bit LFSR. the bottom 16 bits are used for the random number*/
shift_lfsr(&lfsr32, POLY_MASK_32);
return(shift_lfsr(&lfsr32, POLY_MASK_32) ^ shift_lfsr(&lfsr31, POLY_MASK_31));
}
void main(void)
{
int random_value[10];
init_lfsrs();
for(int i = 0; i < 10; i++)
{
random_value[i] = get_random();
std::cout << random_value[i] << std::endl;
}
}
我不完全理解这里发生了什么,但我知道它会以非重复序列产生一个 32 位数字。我认为它需要前 16 位作为显示的数字。
我想做的是从中产生一个1-6之间的数字……有人能帮忙吗?
编辑我还打算将 2 个种子值更改为 srand(time) rand() 数字,这样它就不会每次都以相同的方式开始。这是正确的,我该怎么做?