Как упомянул ранее Крейк, постоянное начальное значение (или начальное значение) означает, что ваша функция будет генерировать детерминированное значение c.
Чтобы каждый раз собирать различное случайное число, вы должны генерировать начальное число из состояния компьютера (обычно времени), 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;
}
}