首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LFSR生成随机骰子

使用LFSR生成随机骰子
EN

Stack Overflow用户
提问于 2013-07-20 17:08:14
回答 1查看 2.8K关注 0票数 0

我有一个代码,它使用从互联网上得到的左反馈移位寄存器生成一个随机数:

代码语言:javascript
复制
#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()数字,这样它就不会每次启动相同的值。这是对的吗?我该怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-20 17:22:08

若要生成介于1和6之间的随机数,请执行以下操作

代码语言:javascript
复制
 int myRandomNumber = 1 + (random_value[i] % 6);

为什么要这么做?

代码语言:javascript
复制
random_value[i] % 6

将产生介于0到5之间的值,因此我们将1添加到其中以得到介于1和6之间的值。

读一读模算子

http://www.cprogramming.com/tutorial/modulus.html

通常,要在某个闭集a,b中生成一个随机数,您可以这样做

代码语言:javascript
复制
int myRandomNumber = a + ( random_value[i] % (b - a + 1) )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17764587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档