给定一个介于0到1之间的实数。这是我的善良因子。这个因子是一种概率。我的意思是,如果它是0.2,就意味着某件事发生的概率是1/5。
我试图使用
random
过程。下面是我的代码:
(if (eq? 'c (tit-for-tat my-history other-history))
'c
(if (= (random (/ 1 niceness-factor)) 0) 'c 'd))
然而,"随机"过程希望我给出一个精确的整数。我该如何解决这个问题?有没有类似随机的程序?
只需将niceness-factor
转换为类似整数的值(与random
的结果相当)。例如:
(if (eq? 'c (tit-for-tat my-history other-history))
'c
(if (> (random 100) (* 100 niceness-factor))
'c
'd)))
解决这个问题的一种方法是使用(random 1)。现在,如果结果<= nice -factor,则执行"某事",否则执行"什么都不做"。
原理:
在包含(0,1)的范围内,有20%的概率得到数字<=0.2。
在racket和racket/base模块中,(random k)
生成一个从0到k-1(含k-1)的整数。(k必须在1和4294967087之间,包括在内)(random
给出了一个介于0和1之间的不精确数字。参考指南:随机提供球拍和球拍/底座
假设您正在使用球拍,而不是球拍支持的其他语言之一,从您开始添加对精确轮调用的地方将最接近您开始的地方:
(if (eq? 'c (tit-for-tat my-history other-history))
'c
(if (= (random (exact-round (/ 1 niceness-factor))) 0) 'c 'd))
但是我发现下面的语句更简单:
(if (eq? 'c (tit-for-tat my-history other-history))
'c
(if (<= (random) niceness-factor) 'c 'd))