F # получение списка случайных чисел - PullRequest
11 голосов
/ 19 мая 2011

Я пытаюсь заполнить список случайными числами, и мне трудно получить часть случайного числа. То, что у меня есть сейчас, распечатывает случайное число 10 раз, я хочу распечатать 10 разных случайных чисел

   let a = (new System.Random()).Next(1, 1000)


   let listOfSquares = [ for i in 1 .. 10->a]
    printfn "%A" listOfSquares

какие-либо советы или предложения?

Ответы [ 4 ]

35 голосов
/ 19 мая 2011

Ваш код просто получает одно случайное число и использует его десять раз.

Этот метод расширения может быть полезен:

type System.Random with
    /// Generates an infinite sequence of random numbers within the given range.
    member this.GetValues(minValue, maxValue) =
        Seq.initInfinite (fun _ -> this.Next(minValue, maxValue))

Тогда вы можете использовать это так:

let r = System.Random()
let nums = r.GetValues(1, 1000) |> Seq.take 10
21 голосов
/ 19 мая 2011
let genRandomNumbers count =
    let rnd = System.Random()
    List.init count (fun _ -> rnd.Next ())

let l = genRandomNumbers 10
printfn "%A" l
3 голосов
/ 20 мая 2011

Когда я пишу случайный распределитель, мне нравится использовать один и тот же генератор случайных чисел для каждого вызова распределителя. Вы можете сделать это в F # с помощью замыканий (комбинация ответа Джоэла и Илджарна).

Пример:

let randomWord =
    let R = System.Random()
    fun n -> System.String [|for _ in 1..n -> R.Next(26) + 97 |> char|]

Таким образом, один экземпляр Random «запекается» в функции, повторно используя его при каждом вызове.

0 голосов
/ 16 января 2019

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

let rnd = System.Random()
let genRandomNumbers count random =
    List.init count (fun _ -> random.Next ())

let l = genRandomNumbers 10
printfn "%A" l
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...