这是解决问题的一种方法。代码的结构与您的版本不同 - 我正在生成一个数组(行),然后使用array2D
. 每行中的值是使用uniqueNumbers
函数生成的,该函数使用给定的随机数生成器(函数)生成一系列唯一数字。
为了生成唯一的数字,我们使用递归循环并保留一组generated
数字。当我们生成一个新数字时,我们首先检查该数字是否不在生成的集合中(如果是,我们尝试另一个)。请注意,如果您需要更多的唯一数字,这会变慢(但这在本示例中可能不是问题):
let uniqueNumbers generator =
let rec loop generated = seq {
let n = generator()
if Set.contains n generated then
yield! loop generated
else
yield n
yield! loop (Set.add n generated) }
loop Set.empty
现在我们可以通过迭代行索引 0 到 4 来生成一张卡片,并且我们生成一个具有唯一编号的行(我们使用 5 个唯一编号来构建每一行):
let generateCard =
let randNumberGen = new Random()
[ for i in 0 .. 4 ->
uniqueNumbers (fun () -> randNumberGen.Next((i * 15) + 1, ((i + 1) * 15 + 1)))
|> Seq.take 5 ]
|> array2D