昔我往矣

数字游戏

2013年06月13日

在书上读到这么一个游戏,有n(n>1)个人坐在一块,每个人报一个100以内的数字,所报数字和所有这些数字平均值的三分之二最接近的人获得胜利.现在n个人每人随机报一个100以内的数字,这n个数字的平均值的三分之二为w,那么这n个数字中和w的差的绝对值最小的人获胜。那么通过下面的python程序可以简单模拟这个过程.

#!/usr/bin/python
import random

num = raw_input('Enter an integer(>1):')

while(1):
    try:
        num = int(num)
        if num > 1:
            break
        else:
            raise someError;    
    except :
        num = raw_input('Please Enter an INTEGER(>1):')
        
aa = []
total = 0
for i in range(0, num):
    aa.append(random.uniform(1,100))
    total += aa[i]

avg = total / num
end = avg * 2 / 3

diff = {}
for i in range(0, num):
    diff[aa[i]] = abs(aa[i] - end)

near = sorted(diff.items(),key=lambda d:d[1])[1]

print "There are %d numbers ." % num
print "The 2/3 of Average is %f . " % end
print "The closest random digit is %f ." %near[0] 

利用python程序模拟这么一个过程可以发现,随机数的平均值应该在50左右,那么,平均值的2/3应该为33左右.
rand1
作为智慧生物,当所有人都想要获得胜利的时候,大家会把所报的数字都选在33附近,现在平均值就应该是33,33的2/3就是22.以此类推,最后的结果就会推到0.从现实的比赛情况来看,大家都会往33和22附近的数字上报,以求获得胜利,据说一般猜22附近的人更容易获胜.

再看另外一个游戏,有科学家证明抛硬币游戏的时候,正反面出现的概率并不完全相同,基于这样的疑问,我们会想到那么系统随机数字出现的概率是不是完全一样的?通过下面的代码随机生成0~99之间的数字,分别统计落在0~49和50~99之间的个数:

#!/bin/bash

read -p "Enter your number(>1):" number

while true
do
    if [ $number -gt 1 ] 2> /dev/null && [ $? -eq 0 ]
    then
        break
    else
        read -p "Please Enter your Number(>1):" number 
    fi
done

l=0
g=0

for((i=1;i<=$number;i++)) 
do
    if [ $((RANDOM % 100)) -le 49 ]
    then 
        let l++
    else
        let g++
    fi
done

echo "There are $number random numbers"
echo "$l numbers is less than 50"
echo "$g numbers is greater than 50"

代码都很简单,不用太多的解释就能读懂。
rand2
因为对python和shell生成随机数方式的不了解,所以同样无法判断这种随机数是不是真正的随机.
程序本身很短,得出的结论也并不严谨和重要,主要为练习脚本编程而作,语言太久不用就会手生.不要让自己懒下来!

已有 2 条评论 »

添加新评论 »