首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LFSR的随机数

使用LFSR的随机数
EN

Stack Overflow用户
提问于 2020-04-04 15:11:11
回答 1查看 381关注 0票数 0

我对这个主题还是个新手。

最初的想法是使用LFSR生成一个随机数。到目前为止,我已经使用c#开发了一种LFSR方法。一旦函数被调用,它总是返回相同的值。

为了在每次运行程序时收集不同的随机数,我必须进行哪些更改?

代码语言:javascript
复制
 int lfsr1()
    {
        int start_state = 5;  /* Any nonzero start state will work. */
        int lfsr = start_state;
        int bit;                    /* Must be 16-bit to allow bit<<15 later in the code */



           /* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */
            bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5)) /* & 1u */;
            lfsr = (lfsr >> 1) | (bit << 15);

        return lfsr;
    }

打电话

代码语言:javascript
复制
Console.Write(lfsr1());

输出总是相同的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-05 10:22:34

正如Creyke之前提到的,一个恒定的种子(或起始值)意味着你的函数将生成一个确定性的值。

为了每次收集不同的随机数,您应该从计算机的状态(通常是时间)、CSPRNG或外部硬件随机数生成器生成种子。

示例(使用时间,使用Environment.TickCount):

代码语言:javascript
复制
using System;

class LSTR
{
    int GetSeed()
    {
        // & with Int32.MaxValue to remove sign bit, i.e get a positive number
        return Environment.TickCount & Int32.MaxValue;
    }
    int lfsr1()
    {
        int start_state = GetSeed();  /* Any nonzero start state will work. */
        int lfsr = start_state;
        int bit;                    /* Must be 16-bit to allow bit<<15 later in the code */
        /* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */

        bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5)) /* & 1u */;
        lfsr = (lfsr >> 1) | (bit << 15);

        return lfsr;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61024861

复制
相关文章

相似问题

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