Как получить случайное начальное число, учитывая первые 2 псевдослучайных числа

Я ищу функцию, которая вернет семя класса С# Random на основе первых двух чисел int, созданных Random.Next(). Я хотел бы избежать грубой силы (это то, что я пробовал). По сути, я ищу обратную функцию для этого кода, которая не основана на грубой силе.

using System;

public class Program
{
    public static void Main()
    {
        int seed = 0;
        Random rnd = new Random(seed);
        Console.WriteLine($"Seed: {seed}");
        Console.WriteLine($"Rnd1: {rnd.Next()}");
        Console.WriteLine($"Rnd2: {rnd.Next()}");
    }
}

Который распечатывает

Seed: 0
Rnd1: 1559595546
Rnd2: 1755192844

Есть ли быстрый способ получить Seed при наличии Rnd1 и Rnd2?


person oleksii    schedule 04.08.2017    source источник
comment
Итак, что вы пробовали? Я ожидал, что некоторые шаги уже предприняты, по крайней мере, предоставление информации о PRNG, используемом в .NET(?). Делая это, вы, вероятно, найдете формулу, которая выглядит простой в использовании, слишком простой (слишком подходящей для вашей константы 2), что наводит меня на мысль, что это происходит из какого-то теста кодирования или соревнования?   -  person sascha    schedule 04.08.2017
comment
Исходный код Random можно найти здесь   -  person spectacularbob    schedule 04.08.2017
comment
Полезен ли этот пост?. Кажется, что это невозможно, или, по крайней мере, грубая сила на самом деле довольно быстра.   -  person Equalsk    schedule 04.08.2017
comment
@sascha Я пробовал грубую силу, что выполнимо, но требует много времени для того, для чего я хочу это использовать. Это не тест на кодирование, это я думаю о конкретной проблеме в поезде.   -  person oleksii    schedule 04.08.2017
comment
@Equalsk Похоже, это выполнимо, по крайней мере, в Oracle Java   -  person oleksii    schedule 04.08.2017
comment
Это всегда выполнимо, если это не криптоPRNG. Так что проверьте, какой PRNG используется (вероятно, изменился за годы), возьмите формулу и посчитайте. Имейте в виду, что это не совсем инверсия. Кажется, вы просите одно совместимое семя. Уникальных может и не быть!   -  person sascha    schedule 04.08.2017
comment
@sascha Я посмотрю на формулу, спасибо. На самом деле, я намеренно ищу слабый ГПСЧ и первое семя, которое дает мне два числа.   -  person oleksii    schedule 04.08.2017
comment
@sascha Всегда можно в конечном итоге сделать вывод о внутреннем состоянии для некриптоГПСЧ, но можете ли вы сделать это из двух наблюдений, зависит от конкретного генератора. Например, MT19937 требует 624 значения для привязки состояния.   -  person pjs    schedule 04.08.2017
comment
@pjs Думаю, я ясно дал понять, что меня интересует не состояние, а совместимое начальное число (из многих возможных начальных значений, дающих ожидаемый результат; конечно, начальное число! = внутреннее состояние для большинства PRNG, особенно MT).   -  person sascha    schedule 04.08.2017
comment
@sascha Мое рабочее предположение состоит в том, что OP хочет получить начальное значение для целей прогнозирования / воспроизводимости. Получение совместимого начального числа, которое будет давать два уже наблюдаемых числа, в этом контексте довольно бесполезно, поскольку нет гарантии, что вы сможете правильно предсказать, каким будет следующее значение.   -  person pjs    schedule 05.08.2017
comment
@pjs Меня интересуют только два значения. Я не уверен, что это всегда возможно, и хотел бы проверить как проект взлома. Я видел несколько примеров для генератора MT и реализации Java. Попробую МТ, посмотрим что получится.   -  person oleksii    schedule 05.08.2017
comment
@oleksii Итак, если я правильно понимаю, вам все равно, каков фактический посев? Вы просто хотите найти начальное число, которое будет воспроизводить первые два наблюдаемых значения? Почему это может быть полезно, или это просто вопрос, могу ли я это сделать?   -  person pjs    schedule 05.08.2017
comment
@pjs Я думал, смогу ли я сжать данные, которые уже сжаты или зашифрованы. Хорошее сжатие должно отображать данные как псевдослучайный шум, как и шифрование. Если я могу найти ГСЧ и начальное число, представляющее 2 числа, я могу сжать два значения int в 1. Если я смогу продолжить этот процесс, сжатые/зашифрованные данные займут половину своего первоначального размера. Далее я подумал, что смогу повторить процесс до очень маленькой последовательности, которая может представлять потенциально большие сжатые или зашифрованные данные. Я не думаю, что это возможно в общем случае, но это была просто интересная идея.   -  person oleksii    schedule 05.08.2017


Ответы (1)


Привет, можно получить семя, но без rnd1 и rnd2 было бы сделать следующее

  var tickCount = Environment.TickCount;
        var random = new Random();
        var seededRandom = new Random(tickCount);


        for (int i = 0; i < 100000000; i++)
        {
            // Does not enter the if case at any point.
            if (random.Next() != seededRandom.Next())
            {
                Console.WriteLine("No match");
            }
        }

Источник: http://referencesource.microsoft.com/#mscorlib/system/random.cs,53

person Robert Andersson    schedule 04.08.2017
comment
Ну, я ищу что-то вроде: int GetSeed(int firstRnd, int SecondRnd). Условие: по двум числам найти семя - person oleksii; 04.08.2017
comment
Хорошо, возможно, этот сайт может вам помочь. - person Robert Andersson; 04.08.2017