случайное число с использованием LFSR - PullRequest
0 голосов
/ 04 апреля 2020

Я немного новичок в этой теме.

Первоначальная идея - генерировать случайное число с использованием LFSR. До сих пор я разработал метод LFSR с использованием c#. После вызова функции она все время возвращает одно и то же значение.

Что мне нужно изменить, чтобы собирать разные случайные числа при каждом запуске программы?

 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());

вывод одинаков для всех время.

1 Ответ

1 голос
/ 05 апреля 2020

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