gpt4 book ai didi

random - 生成一个随机数,不包括单个数

转载 作者:行者123 更新时间:2023-12-04 13:37:12 28 4
gpt4 key购买 nike

我正在写一个Monty Hall模拟器,发现需要生成一个范围内的数字,不包括单个数字。

这似乎很容易,所以我天真地写下了:

(g/...函数是我的个人库的一部分。使用起来应该很清楚):

(defn random-int-excluding
"Generates a random number between min-n and max-n; excluding excluding-n.
min-n is inclusive, while max-n is exclusive."
[min-n max-n excluding-n rand-gen]
(let [rand-n (g/random-int min-n max-n rand-gen)
rand-n' (if (= rand-n excluding-n) (inc rand-n) rand-n)]
(g/wrap rand-n' min-n (inc max-n))))

这将生成一个范围内的随机数,如果等于排除的数,则将其加一;包装,如果需要的话。当然,这最终为排除号码之后的号码提供了两次被选择的机会,因为如果选择了号码或排除号码,则该号码将被选中。采样输出频率范围为0到10(不包括最大值),不包括2:
([0 0.099882]
[1 0.100355]
[3 0.200025]
[4 0.099912]
[5 0.099672]
[6 0.099976]
[7 0.099539]
[8 0.100222]
[9 0.100417])

然后,我阅读了 this answer,它看起来更加简单,并基于它写了:
(defn random-int-excluding
"Generates a random number between min-n and max-n; excluding excluding-n.
min-n is inclusive, while max-n is exclusive."
[min-n max-n excluding-n rand-gen]
(let [r1 (g/random-int min-n excluding-n rand-gen)
r2 (g/random-int (inc excluding-n) max-n rand-gen)]
(if (g/random-boolean rand-gen) r1 r2)))

基本上,它将范围分为2个较小的范围:从最小值到排除数,从排除数+1到最大值。它从这些范围生成随机数,然后随机选择其中之一。但是,不幸的是,正如我在回答中所指出的那样,除非两个分区的大小相等,否则这会导致结果偏斜。样本输出频率;与上述相同的条件:
([0 0.2499497]
[1 0.2500795]
[3 0.0715849]
[4 0.071297]
[5 0.0714366]
[6 0.0714362]
[7 0.0712715]
[8 0.0715285]
[9 0.0714161])

请注意,在排除数字出现的可能性更大之前,较小范围的数字部分会出现。为了解决这个问题,我不得不歪斜它,以便更频繁地从更大的范围中选择数字,实际上,我一般的数学知识还不足以理解如何做到这一点。

我查看了链接问题中可接受的答案,但对我来说,这似乎是我第一次尝试接受一个以上要排除的数字的版本。我希望,与回答者所说的相反,排除范围末尾的数字会受到青睐,因为如果选择的数字在排除范围之内,它只会使数字超出范围。

由于这将是模拟中最常用的函数之一,因此我真的想避免使用“蛮力”循环方法,而将生成的数字排除在外,因为范围只有3个数字,所以有一个每次尝试都需要重试的机会为1/3。

有谁知道从连续范围中选择一个随机数但排除单个数的简单算法?

最佳答案

只需生成一个惰性序列并过滤掉不需要的项目即可:

(let [ignore #{4 2}]
(frequencies
(take 2000
(remove ignore (repeatedly #(rand-int 5))))))

映射到不同新值的其他方法的优点:此函数也可以与 different discrete random number distributions一起使用。

关于random - 生成一个随机数,不包括单个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40498143/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com