Подтвердить что ты не робот

F # получение списка случайных чисел

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

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


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

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

4b9b3361

Ответ 1

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

let l = genRandomNumbers 10
printfn "%A" l

Ответ 2

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

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

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

Ответ 3

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

Пример:

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

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

Ответ 5

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

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

let l = genRandomNumbers 10
printfn "%A" l

Ответ 6

Есть две проблемы:

1) В F # функции должны быть чистыми, поэтому функция без аргументов считается конечным значением.

Чтобы объявить нечистую функцию "без аргументов", пусть она принимает один аргумент типа unit

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

и назовите его передавая аргумент блока

let list = [ for i in 1 .. 10 -> a () ]

Источник

2) Новый экземпляр System.Random() создается каждый раз, когда вызывается a. Это приводит к получению одинаковых номеров. Чтобы это исправить, создайте экземпляр только один раз

let random = new System.Random()
let a () = random.Next(1, 1000)
let list = [ for i in 1 .. 10 -> a ()]

Это не относится к F #, прочитайте объяснение С# для лучшего понимания