Ответ 1
let genRandomNumbers count =
let rnd = System.Random()
List.init count (fun _ -> rnd.Next ())
let l = genRandomNumbers 10
printfn "%A" l
Я пытаюсь заполнить список случайными числами, и у меня есть diffculty, получающий часть случайных чисел. То, что я имею сейчас, распечатывает случайное число 10 раз, я хочу распечатать 10 различных случайных чисел
let a = (new System.Random()).Next(1, 1000)
let listOfSquares = [ for i in 1 .. 10->a]
printfn "%A" listOfSquares
любые советы или предложения?
let genRandomNumbers count =
let rnd = System.Random()
List.init count (fun _ -> rnd.Next ())
let l = genRandomNumbers 10
printfn "%A" l
Ваш код просто получает одно случайное число и использует его десять раз.
Этот метод расширения может быть полезен:
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
Когда я пишу случайный раздатчик, мне нравится использовать один и тот же генератор случайных чисел для каждого вызова диспенсера. Вы можете сделать это в F # с закрытием (комбинация ответов Joel и ildjarn).
Пример:
let randomWord =
let R = System.Random()
fun n -> System.String [|for _ in 1..n -> R.Next(26) + 97 |> char|]
Таким образом, один экземпляр Random "запекается" в функцию, повторно используя ее при каждом вызове.
Вы можете найти эту статью полезной: http://brunoreis.com/tech/generate-random-int-list/
Я думаю, что нужно быть осторожным, как инициализировать System.Random, поскольку он использует текущее время в качестве начального числа. Одного экземпляра должно быть достаточно для всего приложения. Инъекция случайных чисел в функции имеет то преимущество, что вы можете использовать фиксированное начальное число и воспроизводить с полуслучайностью, например, для проверки вашей логики.
let rnd = System.Random()
let genRandomNumbers count random =
List.init count (fun _ -> random.Next ())
let l = genRandomNumbers 10
printfn "%A" l
Есть две проблемы:
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 #, прочитайте объяснение С# для лучшего понимания