设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3264|回复: 16
打印 上一主题 下一主题

[已经过期] 有两个关于随机数几率的问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
50 小时
注册时间
2006-11-16
帖子
3409
1
发表于 2014-11-26 10:12:04 | 显示全部楼层
本帖最后由 金圭子 于 2014-11-26 10:18 编辑

概率啥的我最喜欢了,不过好久不摸ruby了,差点忘了rand(301)是0~300了……结果4楼那里写了个错误的点评,在此致歉。

说一个简单点的情况,把100变成10,把3变成2,这样看起来好理解一点:
假设现在是rand(10),也就是0~9,那0和9的几率都是1/10。
那rand(20)的几率就是0~19,各1/20。
而rand(10)*2呢,是0、2、4、6、8、10、12、14、16、18的几率各为1/10
而rand(10)+rand(10)呢,0和18的几率都是1/100,因为必须是都是0和9的时候才能得到0和18,那一个为0的几率是1/10,另一个也是1/10,最后就是1/100。
下来1和17的话是2倍的0和18,因为1的话是0+1或者1+0,每个是1/100,一共是2/100。
同理,2和16是3/100,3和15是4/100……最后9是10/100。

如果还是不理解,可以看这个图:

最近好多想到PM的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
50 小时
注册时间
2006-11-16
帖子
3409
2
发表于 2014-11-26 13:51:29 | 显示全部楼层
本帖最后由 金圭子 于 2014-11-26 13:58 编辑
myownroc 发表于 2014-11-26 12:03
不过我还想说的是编程中的随机数是伪随机数,样本数量一大会有规律的……
于是单纯的rand(x)规律比较明显, ...


我擦,第一个也太明显了吧,典型的线性代数啊╮(╯o╰)╭
第二个倒是很符合指数律的。

嗯,拷贝到VB6实测了一下(我一直觉得vb6是个好东西,平时开个解密码玩配对算24点之类的直接用vb6写个程序跑下多快),
第一个点过去简直就是波浪一样的感觉(汗),
第二个倒是有点星云团的感觉(笑)。

很好奇Command2是啥……

先沉下去想想怎么写一个模拟指数律效果东东出来……

点评

@小传子:真正的随机是完全不受任何影响,但实际很难,伪随机就是比如以当时时间的微秒(百万分之一秒)为随机值这种并非真正随机。  发表于 2014-11-30 21:11
伪随机是什么,大雾  发表于 2014-11-29 14:33
采用LCG产生随机数本身就有这个问题,公式X_n = aX_n-1 + c (mod M)。为此可以采用ICG,公式为X_n = a/X_n-1 + c (mod M)  发表于 2014-11-26 14:01
所有编程语言中的随机数函数都是伪随机吧  发表于 2014-11-26 14:01
Command2是(rnd * 5000 + rnd * 5000 + rnd * 5000 + rnd * 5000 + rnd * 5000) / 5  发表于 2014-11-26 14:01
最近好多想到PM的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
50 小时
注册时间
2006-11-16
帖子
3409
3
发表于 2014-11-26 13:53:28 | 显示全部楼层
龙和许也 发表于 2014-11-26 12:41
啊!!!!!我不懂数学!我不懂数学!为啥在水区出现!

你玩过对面橙光的《本座倒要看看你能活几天》么:

http://www.66rpg.com/game/6738?s ... 1a374a433f596ad1440

我觉得是个很不错的游戏,宫斗和“高等”数学混合在一起的“笑果”很不错,第一次玩到皇后问那个问题的时候我简直笑疯了╮(╯▽╰)╭

最近好多想到PM的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
50 小时
注册时间
2006-11-16
帖子
3409
4
发表于 2014-11-26 14:08:07 | 显示全部楼层
本帖最后由 金圭子 于 2014-11-26 14:17 编辑

嗯,做了个模拟正太分布(好吧,翻了下百度发现“指数律”这个名字好像不是人家的学名,人家叫“正态分布”,当然前面那个是我故意写错的囧),
跑了下果然还是很符合我预测的:

(我不会隐藏,就直接显示啦)



VB 代码复制
  1. Private Sub Command4_Click()
  2.   Me.Cls
  3.   Dim x As Single
  4.   Dim i As Integer, a As Integer
  5.   Dim arr(500) As Integer
  6.   Me.DrawWidth = 2
  7.   For i = 1 To 30000
  8.     Randomize
  9.     x = Rnd * 1000 + Rnd * 1000 + Rnd * 1000 + Rnd * 1000 + Rnd * 1000
  10.     a = Math.Round(x / 10)
  11.     arr(a) = arr(a) + 1
  12.     Me.PSet (a * 10, 5000 - arr(a) * 10)
  13.   Next
  14. End Sub

(好吧,上面公布了Command2,我这里就改成Command4吧,不过图我懒得换了,自己领悟吧)

再来个Command5:



VB 代码复制
  1. Private Sub Command5_Click()
  2.   Me.Cls
  3.   Dim x As Single
  4.   Dim i As Integer, a As Integer
  5.   Dim arr(500) As Integer
  6.   Me.DrawWidth = 2
  7.   For i = 1 To 30000
  8.     Randomize
  9.     x = Rnd * 5000
  10.     a = Math.Round(x / 10)
  11.     arr(a) = arr(a) + 1
  12.     Me.PSet (a * 10, 5000 - arr(a) * 10)
  13.   Next
  14. End Sub
最近好多想到PM的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
50 小时
注册时间
2006-11-16
帖子
3409
5
发表于 2014-11-26 14:21:45 | 显示全部楼层
参考Command2写了个对比的:

VB 代码复制
  1. Private Sub Command6_Click()
  2.   Me.Cls
  3.   Dim x As Single, y As Single
  4.   Dim i As Integer, a As Integer, b As Integer
  5.   Dim arr(500) As Integer, arr2(500) As Integer
  6.   Me.DrawWidth = 2
  7.   For i = 1 To 30000
  8.     Randomize
  9.     x = Rnd * 1000 + Rnd * 1000 + Rnd * 1000 + Rnd * 1000 + Rnd * 1000
  10.     Randomize
  11.     y = (Rnd * 5000 + Rnd * 5000 + Rnd * 5000 + Rnd * 5000 + Rnd * 5000) / 5
  12.     a = Math.Round(x / 10)
  13.     b = Math.Round(y / 10)
  14.     arr(a) = arr(a) + 1
  15.     arr2(b) = arr2(b) + 1
  16.     Me.PSet (a * 10, 5000 - arr(a) * 10)
  17.     Me.PSet (5000 + b * 10, 5000 - arr2(b) * 10)
  18.   Next
  19. End Sub
最近好多想到PM的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
50 小时
注册时间
2006-11-16
帖子
3409
6
发表于 2014-11-26 14:31:39 | 显示全部楼层
本帖最后由 金圭子 于 2014-11-26 14:48 编辑
RyanBern 发表于 2014-11-26 14:27
利用中心极限定理来产生服从正态分布的方法比较少见,因为中心极限定理描述的是极限行为,而n=5明显太小 ...


现在看到公式就头疼,说实话上次玩我之前推荐的那个游戏我突然发现我连傅里叶级数和拉格朗日中值法都忘光了,无比惊讶(好吧我当年小学数学好中学物理化学好而到了大学就只剩下计算机码代码了)。
另外n=5是小了点,不过好像图形还是有点正太的……嗯,换个大点的n来跑下……

n=10和n=20的比照


VB 代码复制
  1. Private Sub Command7_Click()
  2.   Me.Cls
  3.   Dim x As Single, y As Single
  4.   Dim i As Integer, j As Integer
  5.   Dim a As Integer, b As Integer
  6.   Dim arr(500) As Integer, arr2(500) As Integer
  7.   Me.DrawWidth = 2
  8.   For i = 1 To 30000
  9.     x = 0
  10.     For j = 1 To 10
  11.       Randomize
  12.       x = x + Rnd * 1000
  13.     Next j
  14.     a = Math.Round(x / 20)
  15.  
  16.     y = 0
  17.     For j = 1 To 20
  18.       Randomize
  19.       y = y + Rnd * 1000
  20.     Next j
  21.     b = Math.Round(y / 40)
  22.     arr(a) = arr(a) + 1
  23.     arr2(b) = arr2(b) + 1
  24.     Me.PSet (a * 10, 5000 - arr(a) * 10)
  25.     Me.PSet (5000 + b * 10, 5000 - arr2(b) * 10)
  26.   Next i
  27. End Sub
最近好多想到PM的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
50 小时
注册时间
2006-11-16
帖子
3409
7
发表于 2014-11-26 14:56:37 | 显示全部楼层
金圭子 发表于 2014-11-26 14:31
现在看到公式就头疼,说实话上次玩我之前推荐的那个游戏我突然发现我连傅里叶级数和拉格朗日中值法都忘光 ...
把高数放到游戏里面真是无力吐槽,不过Fourier级数和Lagrange定理还是很重要的


好像就是这个题目:



据说是里面最容易的一题了,不过我还是不知道他在说啥(唉)
其实这个游戏真的是蛮有意思的,配合了那画面和那背景音乐的这种台词,真的是非常让人哈哈哈哈哈哈哈哈……
http://www.66rpg.com/game/6738?s ... 1a374a433f596ad1440

(我会告诉你其实我是在刷积分么)
最近好多想到PM的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-31 14:55

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表