使用 LFSR 的随机数
random number using LFSR
我对这个主题有点陌生。
最初的想法是使用LFSR 生成一个随机数。到目前为止,我已经使用 C# 开发了 LFSR 方法。一旦函数被调用,它 returns 始终具有相同的值。
每次我 运行 程序时,我必须更改什么才能收集不同的随机数?
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;
}
通话
Console.Write(lfsr1());
输出始终相同。
正如 Creyke 之前提到的,恒定种子(或起始值)意味着您的函数将生成确定性值。
为了每次都收集到不同的随机数,您应该根据计算机的状态(通常是时间)、CSPRNG 或外部硬件随机数生成器来生成种子。
示例(使用时间,Environment.TickCount
):
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;
}
}
我对这个主题有点陌生。
最初的想法是使用LFSR 生成一个随机数。到目前为止,我已经使用 C# 开发了 LFSR 方法。一旦函数被调用,它 returns 始终具有相同的值。
每次我 运行 程序时,我必须更改什么才能收集不同的随机数?
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;
}
通话
Console.Write(lfsr1());
输出始终相同。
正如 Creyke 之前提到的,恒定种子(或起始值)意味着您的函数将生成确定性值。
为了每次都收集到不同的随机数,您应该根据计算机的状态(通常是时间)、CSPRNG 或外部硬件随机数生成器来生成种子。
示例(使用时间,Environment.TickCount
):
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;
}
}