tcl实现概率统计
袋子里有黑球和白球一共20个,记下拿取白球的次数,计算白球被抓取的概率是多少?
请使用tcl语言来实习概率的计算。怎么样做这道题,首先要引入白球的个数numw和黑球的个数numb,另外要引入个抓取的次数m ,如果抓取的次数越多,那么概率就越准确,如果是无穷次抓取则概率数,为了计算随机抓取白球和黑球,我们对白球和黑球进行编码,设白球的编码为0~numw 黑球的编码为numw ~ numw+numb。 这需要用到tcl中的rand()函数,rand()函数是产生介于0~1加粗样式之间的随机数,
[expr (int(rand()*(
n
u
m
w
+
numw+
numw+numb)))]就以产生 0~
n
u
m
w
+
numw+
numw+numb个随机数函数。 假如抓取100次,10个黑球10个白球,rand()*20就可以产生0~20之间的随机数。如果随机数少于10则代表抓取的是白球,如果大于10少于20则代表是黑球。在这100次抓取,需要给抓取的白球和黑球的次数进行记录分别用wlist和blist两个变量来记录,每抓取记录增加一次。再分别把白球的次数和黑球的次数除总抓取的次数,就得到白球和黑球的抓取概率。在tcl中没有数据转换函数,需要自己转换。
例如 expr 4 / 100大家猜猜tcl计算的结果是多少?是0.04吗,答案是错的,因为4 100是整数, 4 / 100得到结果任然为整数,工具自动取整结果为0,那么怎么办,我们这样4/1.0 那么结果变成了4.0 , 而4.0是是实数 ,再用4.0/100 就得到实数0.04 。是不是很奇怪呀。下面我们来看看算法是如何实现的。
proc gailv {m numw numb} {
set nw1 0
set nb1 0
set wlist {}
set blist {}
for {set i 1} {$i <= KaTeX parse error: Expected 'EOF', got '}' at position 2: m}̲ {incr i} { …numw+KaTeX parse error: Expected '}', got 'EOF' at end of input: … if {suiji >=0 && $suiji < $numw } {
incr nw1
lappend wlist $suiji } elseif {
$suiji >= $numw && $suiji < [expr
n
u
m
w
+
numw+
numw+numb]}
{ incr nb1 lappend blist $suiji }
}
puts "白球出现的列表 $wlist "
puts “黑球出现的列表
b
l
i
s
t
"
p
u
t
s
"
白
球
出
现
次
数
:
blist" puts "白球出现次数:
blist"puts"白球出现次数:nw1
m
黑
球
出
现
次
数
m 黑球出现次数
m黑球出现次数nb1 $m”
set pw [expr
n
w
1
/
1.0
/
nw1/1.0/
nw1/1.0/m]
set pb [expr
n
b
1
/
1.0
/
nb1/1.0/
nb1/1.0/m]
puts “$pw $pb”
puts "白球的概率 : $pw "
puts "黑球的概率 : $pb " } gailv 1000 8 8 得到的概率结果为0.512 0.488
gailv 10000 8 8 得到的概率结果为0.5065 0.4935抓的次数越多概率越准确。