作者Alimen (狂人)
看板GameDesign
标题[程式] 使用乱数种子确保双方获得相同高度图
时间Sun Nov 3 23:32:23 2013
回应cowbaying:
1F:推 Alimen:如果你的高度图是自动产生的 不妨用只传送乱数种子的策略 11/03 21:51
2F:→ Alimen:压缩的方法很多 主要跟资料特性有关 要不要开新串来讨论?11/03 21:52
3F:→ cowbaying:乱数种子有办法还原成一整块地图?11/03 22:23
4F:→ cowbaying:我有研究了minecraft的seed 无法100%阿11/03 22:30
5F:→ cowbaying:因此我才需要将资料无损编码後再还原11/03 22:31
我先叙述一下我所谓的「只传送乱数种子」是什麽:
假设乱数产生函数为 r(n+1) = (r(n)*3+1) % 5
则乱数种子r(0) = 0的情况,连续使用乱数函数会得出以下数列:
0, 1, 4, 3, 0, 1, 4, 3, 0
再假设你的地形生成演算法是横向排列,
也就是利用刚才产生的乱数数列,排成
0, 1, 4,
3, 0, 1,
4, 3, 0
换句话说,由於产生乱数的函数、以及产生地形的演算法是固定的,
所以乱数种子"0",只要是同一套程式,不管到谁的电脑上(除非有硬体问题),
产生的永远都是
0, 1, 4,
3, 0, 1,
4, 3, 0
这里讲得是简化过的例子,
但只要是Pseudo-random(伪乱数),都是一样的道理
而且就算地形生成演算法复杂很多,也不妨碍。
经典的例子应该算是新接龙牌局,
程式并没有实际地储存65535种牌局,
而是利用乱数种子来存。
所以我可以对朋友说「新接龙#1941超难的,你试试看」
而不用把整个牌局抄起来给他。
这里要注意一件事,
这个方法并不适用於「我预先手动产生一张地形图」的场合,
因为你很难去找到一组函数,可以恰好产生与你事先画的图一模一样的地形图。
至於cowbaying你提到你去拿了minecraft的seed出来,
却还原不出一模一样的地形图,
我觉得有可能有几个因素:
1. 你的地形生成演算法,跟minecraft的地形生成演算法不一样。
换句话说,以刚刚那个例子来讲,
可能你产生出来的是
0, 1, 4,
3, 0, 1,
4, 3, 0
而minecraft的演算法产生出来的是
0, 1, 1,
4, 0, 4,
3, 3, 0 (zig-zag)
2. 取乱数的途中多做了什麽事
可能minecraft在取乱数的时候,为了要回应使用者的输入,多取了几个
例如种子 = 0,minecraft实际取用的却是
0, 1, 4, 3, 0, 1, (4), 3, 0, 1
^被拿去做动画效果
生成
0, 1, 4,
3, 0, 1,
3, 0, 1
3. 乱数函数根本就不同
你用 r(n+1) = (r(n)*3+1) % 5
minecraft用 r(n+1) = (r(n)*7+0) % 5
以上是一点浅见,欢迎讨论 ^^;
p.s. 我印象中planetary annihilation的星球好像也是只存乱数种子?
不知道钓不钓得到cjcat XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 27.105.12.240
6F:推 akilight:存seed算满常见的手法,特别是很多4x类型的策略游戏 11/03 23:38
7F:→ akilight:地图产生都是直接存一组seed,存档读取就靠seed重建地图 11/03 23:38
8F:推 cowbaying:但是要怎麽做到真的随机呢? 11/04 00:17
9F:→ azureblaze:除非做赌博程式要真随机做什麽? 11/04 00:20
10F:→ Alimen:「真正的乱数」成本很高 通常是用硬体来读环境噪音来做 11/04 00:25
11F:→ Alimen:例如PuTTYgen是用滑鼠移动的轨迹来产生乱数金钥 11/04 00:31
12F:→ elenya:用真正乱数产生seed,再把seed记下来并不冲突啊 11/04 00:36
13F:→ Alimen:楼上也是个方法 不过跟srand(time())不就差不多了? XDa 11/04 00:39
14F:推 rofellosx:怎样验证 「真正的乱数」? 11/05 10:28
15F:→ Alimen:两者在统计学上是等价的 只是伪乱数"有可能"会被抓到规律 11/05 12:11
16F:→ Alimen:但除了Shakuntala Devi 应该没人能单看数列抓出算式吧.. 11/05 12:13
18F:→ elenya:英文页讲得比较详细 11/05 22:09
19F:推 cowbaying:受益良多 原来从理论着手能够得到更多讯息 11/05 22:48
20F:推 cowbaying:意外发现用SEED产生地图的演算法还挺多的... 11/08 22:33