我有一个代码,它使用从互联网上得到的左反馈移位寄存器生成一个随机数:
#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位作为显示的数字。
我想要做的是从this...anyone生成一个介于1-6之间的数字,可以帮助解决这个问题吗?
编辑i还打算将2个种子值更改为srand( time ) rand()数字,这样它就不会每次启动相同的值。这是对的吗?我该怎么做?
发布于 2013-07-20 17:22:08
若要生成介于1和6之间的随机数,请执行以下操作
int myRandomNumber = 1 + (random_value[i] % 6);为什么要这么做?
random_value[i] % 6将产生介于0到5之间的值,因此我们将1添加到其中以得到介于1和6之间的值。
读一读模算子
http://www.cprogramming.com/tutorial/modulus.html
通常,要在某个闭集a,b中生成一个随机数,您可以这样做
int myRandomNumber = a + ( random_value[i] % (b - a + 1) )https://stackoverflow.com/questions/17764587
复制相似问题