Project1

标题: 有两个关于随机数几率的问题 [打印本页]

作者: stella    时间: 2014-11-26 08:12
标题: 有两个关于随机数几率的问题
本帖最后由 stella 于 2014-11-26 08:16 编辑

1):是rand(301)得到300的几率大,还是rand(101)+rand(101)+rand(101)得到300的几率大?

2):是rand(101)+rand(101)+rand(101)得到300的几率大,还是rand(101)*3得到300的几率大?
作者: 星尘泪    时间: 2014-11-26 08:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: stella    时间: 2014-11-26 08:36
星尘泪 发表于 2014-11-26 08:30
根据概率学
1.rand(301)
2.rand(301)*3

能不能得出概率小的那一种算法算出300的概率是多少?
作者: myownroc    时间: 2014-11-26 09:35
本帖最后由 myownroc 于 2014-11-26 11:50 编辑

rand(301)要等于300概率为1/301
3个rand(101)相加要是想等于300,必须要求3个数都是100
得到100的概率是1/101,故这种方法的概率是1/101的三次方。

然后rand(101)*3概率是1/101
作者: 芯☆淡茹水    时间: 2014-11-26 09:50

1):LS

2):rand(101)*3得到300的几率大。
作者: 金圭子    时间: 2014-11-26 10:12
本帖最后由 金圭子 于 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。

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


作者: RyanBern    时间: 2014-11-26 10:59
前来解答作死:
设Xi是独立同分布(independent identical distributed)的随机变量,P(Xi=k) = p(k),(1<=i<=n)
在这个问题里面(第一个问题的第二种情况),n=3,k=0,1,2,3,...,100,p(k) = 1/101,对于任意的k
考察X1的概率母函数g(s):

由于Xi是独立同分布的,所以Y的概率母函数是g(s)的n次方(这里n=3)

则利用概率母函数的性质,P(Y=300)为s^300前的系数:
P(Y=300)=(302C2+201C2+100C2)/(101^3)=1/(101^3)

PS:其实这种方法不是作死,用这种方法,求任意P(Y=k)都是比较容易的(相比于穷举而言)
作者: myownroc    时间: 2014-11-26 12:03
本帖最后由 myownroc 于 2014-11-26 12:09 编辑

不过我还想说的是编程中的随机数是伪随机数,样本数量一大会有规律的……
于是单纯的rand(x)规律比较明显,而n个rand(x/n)相加却能有所改善
以下是VB的结果

随机生成(x, y)以(x, y)为坐标绘制点。
rand(x)
rand(x/n)

地图炮:@RyanBern @金圭子 @芯☆淡茹水  
作者: 龙和许也    时间: 2014-11-26 12:41
啊!!!!!我不懂数学!我不懂数学!为啥在水区出现!{:2_270:}
作者: 金圭子    时间: 2014-11-26 13:51
本帖最后由 金圭子 于 2014-11-26 13:58 编辑
myownroc 发表于 2014-11-26 12:03
不过我还想说的是编程中的随机数是伪随机数,样本数量一大会有规律的……
于是单纯的rand(x)规律比较明显, ...


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

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

很好奇Command2是啥……

先沉下去想想怎么写一个模拟指数律效果东东出来……
作者: 金圭子    时间: 2014-11-26 13:53
龙和许也 发表于 2014-11-26 12:41
啊!!!!!我不懂数学!我不懂数学!为啥在水区出现!

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

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

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


作者: 金圭子    时间: 2014-11-26 14:08
本帖最后由 金圭子 于 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

作者: 金圭子    时间: 2014-11-26 14:21
参考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

作者: RyanBern    时间: 2014-11-26 14:27
本帖最后由 RyanBern 于 2014-11-26 14:31 编辑
金圭子 发表于 2014-11-26 14:08
嗯,做了个模拟正太分布(好吧,翻了下百度发现“指数律”这个名字好像不是人家的学名,人家叫“正态分布” ...


利用中心极限定理来产生服从正态分布的方法比较少见,因为中心极限定理描述的是极限行为,而n=5明显太小,n取太大又不现实。
因此可以参考下面的方法(需要初等概率论的知识)。
这里假设计算机能生成(0,1)之间的随机数,即随机变量X~U(0, 1),设F(x)为你要模拟的随机变量的分布函数(这里为正态分布的分布函数),那么,Y=F-1(X)就服从标准正态分布。其中F-1(x)为F(x)的广义逆(在正态分布的条件下,这个也是F的严格逆)
由于一维正态分布的分布函数F不容易算出,这里运用2维正态分布来处理一维的情况。

1.事实:如果X是(0, 1)均匀分布,那么Y=-ln(X)服从参数为1的指数分布

2.二维正态分布,相关系数为0,均值为(0, 0)方差为(1 ,1)的正态分布,其密度为exp(-(x^2+y^2)/2)/2pi,极坐标下为rexp(-r^2/2)/2pi,这说明r服从一个指数分布,θ服从(0. 2pi)上的均匀分布,所以

按照上述公式产生的X和Y都满足N(0, 1),而且相互独立。
其中ξ1和ξ2服从(0, 1)均匀分布,且相互独立。

(科普一下,请勿认真)

作者: 金圭子    时间: 2014-11-26 14:31
本帖最后由 金圭子 于 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

作者: 金圭子    时间: 2014-11-26 14:56
金圭子 发表于 2014-11-26 14:31
现在看到公式就头疼,说实话上次玩我之前推荐的那个游戏我突然发现我连傅里叶级数和拉格朗日中值法都忘光 ...
把高数放到游戏里面真是无力吐槽,不过Fourier级数和Lagrange定理还是很重要的


好像就是这个题目:



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

(我会告诉你其实我是在刷积分么)
作者: stella    时间: 2014-11-26 22:10
用来作为随机装备中生成str_plus的一个算法,数值大概在3~400之间,rand(角色等级)*(rand(2)+1)+rand(角色等级)+rand(角色等级),各位看看还有没有更好玩的算法?




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1