Я переношу старое приложение с VB6 на C# и обнаружил проблему со случайной последовательностью чисел:
(pin - это число больше 0 в строковом формате) В моем коде VB я обнаружил:
Rnd("-" & pin)
Randomize(CDbl(pin))
Итак, код все время генерирует одну и ту же числовую последовательность (читайте примечание это)
Теперь в моем коде C# у меня есть:
Random r = new Random(int.Parse(pin))
Но он не генерирует ту же последовательность.
Я стараюсь избегать инструкции VBMath.Rnd (), если это возможно.
Подскажите, пожалуйста, каков эквивалентный код на C#?
Заранее большое спасибо!
Я не думаю, что реализация ГСЧ в VB6 такая же, как и в версии .Net.
@jdweng Его проблема в том, что генератор псевдослучайных чисел VB6 отличается от генератора .NET, и ему нужна реализация VB6 на C#, но он не хочет использовать VBMath.Rnd().
В примечании говорится следующее: Чтобы повторить последовательности случайных чисел, вызовите Rnd с отрицательным аргументом непосредственно перед использованием Randomize с числовым аргументом. Использование Randomize с тем же значением для Number не повторяет предыдущую последовательность.
@the_lotus: Это правда в C#, но в данном случае это не так.
@xanatos: Да, я предпочитаю не использовать VBMath.Rnd (), если это возможно ...
Почему вы не хотите использовать работающий код?
@Tistkle Такой генератор псевдослучайных чисел небезопасен для шифрования. При шифровании следует использовать генераторы случайных чисел с криптографической стойкостью. Вам следует повторно зашифровать свои данные, используя более безопасный метод шифрования.
@mjwills: Это не от меня зависит ... :(
Что это обозначает? Что от тебя не зависит? Если кто-то говорит вам не использовать метод, вы должны спросить его Зачем. Потому что очень странно хотеть иметь конкретную функциональность, которая выполняет очень конкретную определенную вещь, и у Microsoft есть написано, эта функциональность (и протестировала ее и т.д. и т.д.) - но вы не хотите ее использовать.





Здесь есть разные проблемы:
Вы решили, что не хотите использовать повторную реализацию Microsoft методов Random() / Rnd() VB6 (из сборки Microsoft.VisualBasic) и
Отсутствует полная общедоступная документация функции Random() (есть частичная документация функции Rnd() за вычетом части о повторном заполнении с использованием отрицательных чисел здесь и здесь)
Теперь ... Есть повторная реализация алгоритма в VB.NET здесь, который утверждает, что это VBMath Rnd () 1: 1 Клон,
но проблема заключается в законности этой сути ... Мы не знаем, как автор реверс-инжиниринговал алгоритм ... Если то, что вы делаете, предназначено для личного использования, вы явно можете использовать IlSpy и взглянуть на сборку Microsoft.VisualBasic. где вы можете найти весь алгоритм (это менее 100 строк кода, а projectData.m_rndSeed - это 327680, как описано в вики). Если вы хотите, вам даже не нужно использовать IlSpy ... Microsoft поместила исходный код (написанный на vb.net) в свой источник ссылок github, но обратите внимание, что возникают те же проблемы с законностью: код в источнике ссылок предназначен только для просмотра .
Благодаря этому я смог аргументировать использование Rnd и выиграл. Я отмечу этот ответ как правильный.
Если вы ищете случайные числа, почему вам важно, чтобы последовательность была такой же?