非常感谢您为我的模型编写代码,
如果你不介意的话,我想问一下你关于编码中的一些解释很抱歉,我不是数学专家
to move
ask turtles with [gender = "male" ]
[ if ( random-float 1) <= 0.025]
为什么是<=以及这段代码的解释是什么,
和百分比
ask turtles
[ if random 100 <= 50
[become-fat]]
同样的问题为什么<=如果我们总是说50%的人是肥胖的为什么我们要放这个符号??
和随机浮点数
有什么区别?抱歉打扰了
两个原语的区别是:
-
random
只给出整数,例如:0、1、2、3等。 -
random-float
提供浮点数,例如:0.0,0.125,0.528476587245,3.66等。
都可以用来在NetLogo中使事情以概率的方式发生。我将从random
的使用开始,它更容易理解。
使用random
如文档中所述,如果您向random
传递一个正数,它将给您一个大于或等于0的数字,但严格小于该数字。
例如,random 2
总是给你0或1。你可以用它来模拟抛硬币:
ifelse random 2 = 0 [ print "heads" ] [ print "tail" ].
这将打印"heads"
50%的时间(当random 2
给你0),"tail"
50%的时间(当random 2
给你1)。
现在很容易将其推广到用百分比表示的概率,用random 100
代替random 2
。我将使用50%的例子,但它可以是25%,80%甚至1%或100%。
既然random 100
给了你一个介于0和99之间的数字,这意味着它能给你的前50个数字是:0,1,2,3…一直到49。接下来的50个是:50 51 52 53…一直到99。如果你愿意,你可以想象一个标有0到99的100面骰子。
如果你想让你的乌龟50%的时间"变胖",你可以这样做:
ask turtles [ if random 100 < 50 [become-fat] ]
请注意,我使用了<
(严格小于)符号而不是<=
(小于或等于)符号。这是因为我只希望当"骰子"落在前50个面(从0到49)中的一个面时,海龟才会变胖。
(如果你使用random 100 <= 50
,就像你上面发布的代码一样,他们实际上有51%的概率变胖,49%的概率不变胖。)你现在也应该能够弄清楚为什么像if random 100 = 50
这样的东西是没有意义的:只有当"骰子"正好落在50时才会成立,这种情况只发生在1%的时间。
如果你想让你的海龟只有20%的几率变胖,你应该使用骰子的前20个面,从0到19:
ask turtles [ if random 100 < 20 [become-fat] ]
在NetLogo中处理概率时,通常使用random 100
就足够了。
使用random-float
然而,有时候,您需要更精确一点。以数学为导向的工作通常将概率表示为0.0(0%)和1.0(100%)之间的数字。在这些情况下,random-float 1
就派上了用场。同样,正如文档中所述,random-float
将为您提供一个介于0(包含)和传递给它的数字(排他性)之间的数字。因此,random-float 1
给出了一个介于0.0和1.0之间的数字(但不完全是1.0)。
这个表达式:
random-float 1 < 0.025
在2.5%的情况下为真。
骰子的比喻并不适用于random-float
,但你可以想象一个轮盘赌(或幸运之轮)。询问random-float 1 < 0.025
是否像画一个"馅饼切片",即车轮周长的2.5%,旋转车轮,并检查球(或箭头,或其他任何东西)是否落在该切片中。
现在如果你使用<=
而不是<
与random-float
是否重要?不是很多。只有当车轮正好落在饼形切片与车轮其余部分的分隔线上时,才会产生影响,而且发生这种情况的概率非常非常小。