2013-04-01 4 views
1

Я хотел бы генерировать случайные числа - за исключением того же семени, они всегда должны быть одинаковыми. Как это можно сделать?Генерировать предсказуемые случайные числа C#

например. Учитывая, что семя «я люблю черепах», оно должно генерировать число, например. 1234 независимо от того, когда/сколько раз оно называлось. Мне нужно это для приложения безопасности.

+0

Возможный дубликат: http://stackoverflow.com/questions/4060961/seeding-a-pseudo-random-number-generator- in-c-sharp –

+1

Вы знаете, что предсказуемое случайное является оксюмороном. – Romoku

+11

'var random = new Random (« Мне нравятся черепахи ».GetHash())' –

ответ

2

Именно так работают генераторы псевдослучайных чисел (PRNG). При посеве таким же образом они дают одну и ту же последовательность псевдослучайных чисел.

Посмотрите на документации для конструктора Random класса:

Обеспечения идентичного начального значения для различных случайных объектов вызывает каждый экземпляр для создания идентичных последовательностей случайных чисел.

Только обратите внимание, что PRNG используют числовые семена, а не строки, в соответствии с вашим примером в вопросе. И если вам нужен криптографически безопасный PRNG, тогда вам нужно будет использовать класс, отличный от Random, хотя применяются те же принципы, касающиеся семян.

+0

+0. Не имеет значения для потребностей OP –

+0

@SamIam Я не понимаю, что вы имеете в виду. –

+0

Вот что привело ответ для меня. Было бы неплохо иметь одну строку кода, хотя :) – James

0

Класс Random будет генерировать ту же последовательность чисел, если вы снабдите его одним и тем же семенем.

Если вы хотите вернуть предсказуемое число из заданной строки, используйте hash.

0

Если вы делаете безопасность, Вы бы действительно лучше обслуживаться с помощью библиотеки, но если вы абсолютно должны сделать это сами ...

Похоже, вы бы лучше вычислить хэш-код.

here is some information on generating a MD5 hash code from a string

Вот пример кода на этой странице

public static string CalculateMD5Hash(string strInput) 
{ 
    MD5 md5 = System.Security.Cryptography.MD5.Create(); 
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(strInput); 
    byte[] hash = md5.ComputeHash(inputBytes);    

    StringBuilder sb = new StringBuilder();   
    for (int i = 0; i < hash.Length; i++)   
    {    
    sb.Append(hash[i].ToString("x2")); 
    }   
    return sb.ToString();  
} 
Смежные вопросы