随机程序需要精确的整数方案



给定一个介于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))

相关内容

最新更新