2015-04-25 5 views
1

У меня есть следующий код:Генерация случайных чисел F #

let rand = System.Random() 
let gold = [ for i in years do yield rand.NextDouble()] 

Однако я не могу свернуть его в одну линию, как

let gold = [ for i in years do yield System.Random.NextDouble()] 

Почему?

+3

Потому что вам нужно, чтобы создать случайный объект - вы можете сделать '(System.Random()) NextDouble', но вы получите тот же ответ каждый раз, когда –

+0

@JohnPalmer вы * * вероятно получить тот же ответ. каждый раз. Он остается неизменным, если не будет использоваться грубое зерно, используемое для посева. Как правило, автоматический посев нехорошо полагаться; он не является достаточно неопределенным и детерминированным. – Vandroiy

+0

Комбинаторы для генерации случайных структур: https://gist.github.com/eulerfx/9808911 – eulerfx

ответ

1

Большинство случайных чисел, генерируемых компьютерами, например, в случай вашего кода, не являются случайными в истинном смысле этого слова. Они генерируются алгоритмом и задаются алгоритм и семена (как начальная точка для алгоритма), детерминированные.

По существу, если вы хотите серию случайных чисел, вы выбираете семя и алгоритм, а затем этот алгоритм начинает генерировать случайные числа для вас, используя семя в качестве отправной точки и итерации алгоритма оттуда.

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

Компьютеры работают аналогичным образом. Когда вы позвоните

Let rand = System.Random() 

Вы инициализируете генератор случайных чисел. Это похоже на то, что вы создаете книгу, полную случайных чисел. Затем итеративно рисовать случайные числа из ряда, вы

rand.NextDouble() 

Это как собирание первого номера из серии (книги). Позвоните еще раз, и вы выберете второе число из серии и т. Д.

В чем смысл F # /. NET, если вы инициализируете генератор случайных чисел? Что ж, если вам нужны повторяемые результаты, когда случайная серия будет содержать одинаковые числа каждый раз, когда вы запускаете код? Ну, делать это таким образом позволяет установить семя, так что вы гарантированно иметь ту же самую «книгу случайных чисел» каждый раз:

let rand = System.Random(1) 

Или, что если вы хотите различных серий случайных чисел?

let rand1 = System.Random(1) 
let rand2 = System.Random(2) 
+0

Спасибо большое! Все это так ясно! :)) –

4

Ваши два примера кода не эквивалентны. Первый создает объект, а затем повторно вызывает NextDouble() на этом объекте. Второй, по-видимому, вызывает метод static класса Random, но я был бы удивлен, если он даже скомпилируется, поскольку NextDouble() фактически не объявлен как static.

4

Вы можете объединить создание экземпляра Random и его использование в несколько способов, при желании:

let gold = 
    let rand = Random() 
    [for i in 1..10 do yield rand.NextDouble()] 

или

let gold = let rand = Random() in [for i in 1..10 do yield rand.NextDouble()] 
+0

Это очень опасно. Попробуйте сделать три идентичных определения 'gold1'' gold2' и 'gold3' в последовательности: текущая реализация .NET, вероятно, даст как минимум два одинаковых результата. Я бы не советовал использовать более одного экземпляра 'System.Random' - новички будут спотыкаться о посеве, а потоковые программы, которые нуждаются в нескольких экземплярах, действительно должны позволить себе лучшее решение. ('System.Random' имеет некоторые [проблемы с качеством] (http://stackoverflow.com/a/6842191/4191347).) – Vandroiy

Смежные вопросы