开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2067

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1813|回复: 16

[东方喵] 【数学算法】简单唠唠伪随机数(一)

[复制链接]  [移动端链接]
排名
874
昨日变化
5

33

主题

804

帖子

3295

积分

Rank: 9Rank: 9Rank: 9

UID
76248
好友
20
蛮牛币
17701
威望
0
注册时间
2015-2-28
在线时间
864 小时
最后登录
2018-1-23

专栏作家蛮牛译员活力之星七夕浪漫情人一掷千金

发表于 2017-5-18 14:47:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
简单唠唠随机数(一)
生成随机数的算法众多,以下简单列出几个:

1.
平方取中法
伪随机数的概念从很远古的时候就出现了,而第一个应用与计算机的随机数生成器是由我们的祖师爷:冯·诺依曼首先提,所使用的算法是平方取中法,算法举例如下:
假设,取123作为种子,将他平方得到15129,而后取中间三位512,继续平方得到262144,在前面补零,取中间三位621。。。以此继续。。。
但这一算法并不算好,随机数收敛较快,很快就能得到有序的循环数列。

2.
线性同余法
线性同余生成器(Linear Congruential Generator)是数学家 D.H.Lehmer率先使用于javascript,以实现网页上广告的随机展示。
线性同余法是一种较简单常用的伪随机数算法。非常创新的一个seed字符串确定一个世界,《我的世界》就是以一个种子,取hashcode,再利用此算法得到固定的伪随机数,加上柏林噪音得到确定的地形,再根据地形高度确定该区域环境实现的,同理,《无人深空》的2^64个星球实现原理也是类似。
根据递归公式N(j+1)=(A*N(j)+B)mod M
其中,A,B,M为常数,N(0)为需要给定的种子。
要令LCG达到最大周期,应该符合:
(1)B与M互质;
(2)M的所有质因子的积能整除A-1;
(3)若M是4的倍数,则A-1也是;
(4)A,B,N(0)都比M小;
(5)A,B是正整数。
通常来说,M都使用2的几次幂(2^32或2^64),因为这样取模时,就截断最右的32/64位就行了。很多编译器都是使用
线性同余生成器来实现随机数的,而很多时候是使用时间来作为种子,例如早期的最终幻想,他的特定稀有怪物,和物品掉落就是以时间作为种子。
微信图片_20170517174644.png
下面,以最简单的形式模拟下:
[C#] 纯文本查看 复制代码
/*
 * 功能:使用线性同余法(LCG)生成伪随机数
 * Coder:东方喵
 * 时间:2017/5/12
 * 版本:v1.0
 */
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class z : MonoBehaviour {
    private List<int> resultList;//存储结果
    private int j=0;//次数
    private string seed;//种子
    private int A ;//乘数
    private int B ;//增量
    private int M ;//模数
    private void Awake()
    {
        seed = "东方喵";
        int N0 = seed.GetHashCode();
        A = 214013;
        B = 2531011;
        M = (int)Mathf.Pow(2, 64);
        resultList = new List<int>();
        resultList.Add(N0);
        Debug.Log(N0.GetHashCode());
    }

        private void LCG ()//Nj+1 = ( A * Nj + B )( mod M)
    {
        int result;
        result = (A * resultList[j] + B) % M;
        j++;
        resultList.Add(result);
        Debug.Log("第"+j+"次"+result);
    }
        
        private void Update ()
    {
            LCG();
        }
}






评分

参与人数 2鲜花 +55 收起 理由
被杜撰的雨 + 5 淡定
朱迪 + 50 很给力!

查看全部评分


回复

使用道具 举报

7日久生情
2194/5000
排名
17777
昨日变化
15

2

主题

1835

帖子

2194

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2850
威望
0
注册时间
2016-11-22
在线时间
331 小时
最后登录
2018-1-22
发表于 2017-5-19 09:39:26 | 显示全部楼层
赞,学习了,谢谢分享

回复 支持 反对

使用道具 举报

7日久生情
1965/5000
排名
663
昨日变化
1

11

主题

66

帖子

1965

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
79646
好友
0
蛮牛币
3979
威望
0
注册时间
2015-3-14
在线时间
747 小时
最后登录
2018-1-23
QQ
发表于 2017-5-19 09:58:13 | 显示全部楼层
感谢大神分享 十分受用

回复 支持 反对

使用道具 举报

7日久生情
1904/5000
排名
971
昨日变化

2

主题

140

帖子

1904

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
64697
好友
1
蛮牛币
5277
威望
0
注册时间
2014-12-30
在线时间
814 小时
最后登录
2017-12-28
发表于 2017-5-19 10:21:33 | 显示全部楼层
还好,,,有个搞单片机的同事,,,,随机数如果要自己写,,,,我就去抄他的代码,,,,,,,单片机真是片沙漠,啥都得自己写

回复 支持 反对

使用道具 举报

5熟悉之中
824/1000
排名
2860
昨日变化

1

主题

144

帖子

824

积分

Rank: 5Rank: 5

UID
194381
好友
0
蛮牛币
1774
威望
0
注册时间
2016-12-31
在线时间
263 小时
最后登录
2018-1-1
发表于 2017-5-19 13:53:32 | 显示全部楼层
学习了。

回复

使用道具 举报

8常驻蛮牛
6799/10000
排名
227
昨日变化

0

主题

3614

帖子

6799

积分

Rank: 8Rank: 8

UID
3215
好友
0
蛮牛币
179
威望
0
注册时间
2013-9-4
在线时间
1455 小时
最后登录
2018-1-23
发表于 2017-5-19 14:04:41 | 显示全部楼层
的顶顶顶顶顶的顶顶顶顶顶的顶顶顶顶顶

回复 支持 反对

使用道具 举报

8常驻蛮牛
6799/10000
排名
227
昨日变化

0

主题

3614

帖子

6799

积分

Rank: 8Rank: 8

UID
3215
好友
0
蛮牛币
179
威望
0
注册时间
2013-9-4
在线时间
1455 小时
最后登录
2018-1-23
发表于 2017-5-19 14:05:59 | 显示全部楼层
的顶顶顶顶顶的顶顶顶顶顶的顶顶顶顶顶

回复 支持 反对

使用道具 举报

7日久生情
2149/5000
排名
430
昨日变化
1

3

主题

139

帖子

2149

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
44272
好友
3
蛮牛币
6121
威望
0
注册时间
2014-9-10
在线时间
645 小时
最后登录
2018-1-5
QQ
发表于 2017-5-19 14:52:16 | 显示全部楼层
给定一个 相同的值!!输出的 随机值结果 相同。!
[发帖际遇]: 一个袋子砸在了 2582090092 头上,2582090092 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
840/1000
排名
3775
昨日变化
18

1

主题

326

帖子

840

积分

Rank: 5Rank: 5

UID
122160
好友
0
蛮牛币
1453
威望
0
注册时间
2015-9-10
在线时间
196 小时
最后登录
2018-1-23
发表于 2017-5-19 16:44:13 | 显示全部楼层
ganxiefenxiang

回复

使用道具 举报

7日久生情
2150/5000
排名
739
昨日变化
2

0

主题

322

帖子

2150

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
8899
好友
0
蛮牛币
3422
威望
0
注册时间
2013-11-25
在线时间
750 小时
最后登录
2018-1-23
发表于 2017-5-20 00:01:41 | 显示全部楼层
谢谢分享         

回复 支持 反对

使用道具 举报

排名
20813
昨日变化
13

2

主题

28

帖子

70

积分

Rank: 2Rank: 2

UID
153784
好友
1
蛮牛币
219
威望
0
注册时间
2016-6-27
在线时间
22 小时
最后登录
2018-1-20
发表于 2017-5-20 09:03:36 | 显示全部楼层
赚点币。。。。。

回复

使用道具 举报

5熟悉之中
717/1000
排名
2665
昨日变化
11

0

主题

93

帖子

717

积分

Rank: 5Rank: 5

UID
210517
好友
0
蛮牛币
2527
威望
0
注册时间
2017-3-7
在线时间
176 小时
最后登录
2018-1-22
发表于 2017-5-20 09:20:24 | 显示全部楼层

赞,学习了,谢谢分享

回复 支持 反对

使用道具 举报

7日久生情
1623/5000
排名
1324
昨日变化
1

1

主题

498

帖子

1623

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
56496
好友
0
蛮牛币
4732
威望
0
注册时间
2014-11-19
在线时间
360 小时
最后登录
2018-1-23
发表于 2017-5-20 16:05:53 | 显示全部楼层
学习中!!!!

回复

使用道具 举报

3偶尔光临
167/300
排名
10347
昨日变化
5

3

主题

36

帖子

167

积分

Rank: 3Rank: 3Rank: 3

UID
156694
好友
0
蛮牛币
226
威望
0
注册时间
2016-7-14
在线时间
49 小时
最后登录
2017-10-21
发表于 2017-5-21 15:01:53 | 显示全部楼层
感觉认识的都不是同一个伪随机数
,可怕

回复 支持 反对

使用道具 举报

7日久生情
1929/5000
排名
2335
昨日变化

22

主题

1122

帖子

1929

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
132417
好友
3
蛮牛币
7878
威望
0
注册时间
2015-12-23
在线时间
325 小时
最后登录
2018-1-23
发表于 2017-5-22 09:14:51 | 显示全部楼层
学习了,谢谢分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

站长推荐 上一条 /1 下一条

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