免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 李营长
打印 上一主题 下一主题

python随机数生成不够随机, [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-07-21 16:59 |只看该作者
回复 10# 李营长


    PIL好学?

论坛徽章:
0
12 [报告]
发表于 2011-07-21 17:43 |只看该作者
回复 11# ubuntu_mark


    说不上好学,它的文档很不友好。

论坛徽章:
0
13 [报告]
发表于 2011-07-21 18:15 |只看该作者
本帖最后由 iamkey9 于 2011-07-21 18:18 编辑

回复 10# 李营长

我这里10次以后完全纯白,另外说1000*1000 覆盖 1200*800应该全覆盖,
这不能同意,随机不代表是没有重复,只是在足够大数据的情况下数字出现的概率相等,近似1:1覆盖比率下,应该白和黑50%:50%

回复营长,如果有你说的不够随机的情况,出现的情况应该是点集中在某个区域,或者呈现规律的图样,我这点暂时没有验证到。
  1. from PIL import Image
  2. import random

  3. if __name__ == "__main__":
  4.         im = Image.new("RGB", (1201,801), (0,0,0))
  5.         for _ in xrange(0,10):
  6.             for i in xrange(0, 1280*800):
  7.                 #x = random.randint(0, 1200-1)
  8.                 #y = random.randint(0, 800-1)
  9.                 x = random.randint(0, 1200*800) % 1200
  10.                 y = random.randint(0, 1200*800) % 800

  11.                 #print  i, x, y
  12.                 im.putpixel((x,y),(255,255,255))
  13.             print _
  14.                
  15.         im.save("d:\\xx.bmp")
复制代码

论坛徽章:
0
14 [报告]
发表于 2011-07-21 20:08 |只看该作者
回复 13# iamkey9


    你可以生成0-100间的数,生成10000次。然后把数字出现的频率记下来,这个是点分布图做不到的。你会发现分布并不是很均匀。

论坛徽章:
0
15 [报告]
发表于 2011-07-21 22:47 |只看该作者
本帖最后由 iamkey9 于 2011-07-21 23:45 编辑

回复 14# 李营长


貌似没有那么均匀,但是也没得到你说的中值附近数字多的结论,是否是版本不一样? 我这里是2.7.1
  1. import random
  2. f = {}
  3. for i in xrange(0,9999):
  4.     r = random.randint(0, 100)
  5.     if not f.has_key(r): f[r] = 0
  6.     f[r] += 1
  7. #for key in sorted(f.iterkeys()): print "%s: %s" % (key, f[key])
  8. print min(f.values()), max(f.values()), sum(f.values())/len(f)
  9. print ""
  10. print [f[x] for x in range(48,52)]
复制代码
#------------------------------

80 137 99

[115, 99, 82, 89]

69 124 99

[100, 76, 95, 117]

72 131 99

[86, 85, 93, 92]

78 120 99

[100, 109, 79, 103]


另外:2#那网站的得到随机数的方法很特别,接近真实随机数,从他们那里得到的数据做简单统计,和random结果类似,不知道是否是数据量大小的问题:
  1. import random
  2. from truerandom import *

  3. f = {}
  4. a = getnum(0,100,9999)
  5. for i in range(0,len(a)):
  6.     r = a[i]
  7.     if not f.has_key(r): f[r] = 0
  8.     f[r] += 1
  9. #for key in sorted(f.iterkeys()): print "%s: %s" % (key, f[key])
  10. print min(f.values()), max(f.values()), sum(f.values())/len(f)
  11. print ""
  12. print [f[x] for x in range(48,52)]
复制代码
77 125 99

[106, 101, 108, 88]

78 125 99

[103, 88, 99, 102]

76 123 99

[91, 102, 108, 94]

76 127 99

[87, 88, 94, 106]

论坛徽章:
27
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:24:09CU大牛徽章
日期:2013-09-18 15:24:20CU大牛徽章
日期:2013-09-18 15:24:25CU大牛徽章
日期:2013-09-18 15:24:31CU大牛徽章
日期:2013-09-18 15:24:36CU大牛徽章
日期:2013-09-18 15:24:41CU大牛徽章
日期:2013-09-18 15:24:48CU大牛徽章
日期:2013-09-18 15:24:52处女座
日期:2013-09-27 17:45:43
16 [报告]
发表于 2011-07-22 09:15 |只看该作者
最好加个时间种子吧

论坛徽章:
0
17 [报告]
发表于 2011-07-22 11:55 |只看该作者
回复 16# yifangyou
最好加个时间种子吧
yifangyou 发表于 2011-07-22 09:15

不需要。标准库里这个实现已经使用了时间种子。

论坛徽章:
0
18 [报告]
发表于 2011-07-22 11:58 |只看该作者
回复 15# iamkey9
想得到真随机数只能是用os提供的调用,没别的办法。

论坛徽章:
0
19 [报告]
发表于 2011-07-22 13:22 |只看该作者
回复  iamkey9
想得到真随机数只能是用os提供的调用,没别的办法。
106033177 发表于 2011-07-22 11:58



   系统的随机数也不是真随机。truerandom.py是从random.org抓数据的方式得到随机数的,应该是目前民间能够得到最好的随机方式了。

论坛徽章:
0
20 [报告]
发表于 2011-07-22 14:05 |只看该作者
回复 19# iamkey9
系统的随机数也不是真随机。truerandom.py是从random.org抓数据的方式得到随机数的,应该是目前民 ...
iamkey9 发表于 2011-07-22 13:22

no     random.SystemRandom()就是从系统熵池里获取的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP