Недавно я ответил на вопрос, который был отредактирован членом @dtb.Почему Random() реализован таким образом в .Net?
filling a array with uniqe random numbers between 0-9 in c#
вопрос предусматривал использование Random() - и сказал член редактировал свой ответ, чтобы избежать этого common pitfall (как он выразился)
Мой исходный код не был уязвим к этому вопросу в изоляции, как это было следующим образом:
public void DoStuff()
{
var rand = new Random();
while() {} //Inner loop that uses 'rand'
}
ответ был отредактирован, как оказалось намерение было вызвать функцию в цикле - который сделал бы код уязвимой - она была изменена по существу:
public void DoStuff(Random R)
{
while() {} //Inner loop that uses 'rand'
}
Моя немедленная мысль была - это просто протолкнул бремя поддержания случайный экземпляр дальше вверх по стеку - и если программист в вопросе doen't понять, как это будет реализовано, они все равно попадают в эту ловушку ,
Я предполагаю, что мой вопрос - почему это не Random() в .Net реализовано так же, как в Javascript, например, с одним статическим глобальным Random() (Say, per AppDomain?)? Естественно, вы все же можете предоставить более явные перегрузки/методы, которые используют текущее время в качестве семени, в очень редких случаях, когда вам нужно управлять семенем.
Несомненно, это позволило бы избежать этой общей ошибки. Кто-нибудь может рассказать мне о преимуществах подхода .Net?
EDIT: Я понимаю, что контроль над семенем важен - однако, соблюдение этого значения по умолчанию представляется странным выбором. Если кто-то хочет взять под контроль семена, вероятно, они знают, что они делают.
Cheers.
'Random' класс. Как у вас будет глобальный генератор, который охватывает машины, домены приложений и т. Д. ...? – Oded
Возможный дублированный вопрос, http://stackoverflow.com/questions/4933823/class-system-random-why-not-static –
Инициализация «Случайного» может иметь накладные расходы, которые не следует страдать, если они не намерены ее использовать. – Jon