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

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: stella
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

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

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

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

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

点评

嘿嘿~我会找个时间玩玩的,话说我很就没玩橙光游戏了呢。  发表于 2014-11-26 13:58
最近好多想到PM的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
50 小时
注册时间
2006-11-16
帖子
3409
12
发表于 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
13
发表于 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的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9497
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

14
发表于 2014-11-26 14:27:52 | 只看该作者
本帖最后由 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)均匀分布,且相互独立。

(科普一下,请勿认真)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
50 小时
注册时间
2006-11-16
帖子
3409
15
发表于 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

点评

把高数放到游戏里面真是无力吐槽,不过Fourier级数和Lagrange定理还是很重要的  发表于 2014-11-26 14:35
最近好多想到PM的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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


好像就是这个题目:



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

(我会告诉你其实我是在刷积分么)

点评

答案是第二个,这个游戏我好像玩过  发表于 2014-11-26 17:38
最近好多想到PM的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
231 小时
注册时间
2007-12-17
帖子
541
17
 楼主| 发表于 2014-11-26 22:10:03 | 只看该作者
用来作为随机装备中生成str_plus的一个算法,数值大概在3~400之间,rand(角色等级)*(rand(2)+1)+rand(角色等级)+rand(角色等级),各位看看还有没有更好玩的算法?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-4 15:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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