Re: [问题] 关于转蛋游戏的都市传说

楼主: jpopaholic (日音スキ)   2014-12-12 02:03:58
※ 引述《attacksoil (击壤)》之铭言:
: 1. 垫子法: 例如PAD石抽抽不好时先去抽几发友情抽
: 2. 时段说: 传说中半夜12:01最容易出金蛋etc.
: 3. 欧洲帐号: 有些人怎么抽脸就是很白 有些人怎么抽就是脸很黑
: 直觉认为上述这三种应该都只是网民的妄想
: 公司干嘛去弄这种奇怪的设定
: 不过转念一想 就像有业配存在一样
: 公司也不是没有可能故意让某些条件下抽蛋机率不均
: 以刺激网络社群讨论...
: 不知道版上的各位高手有听过类似的八卦吗?
就一个程式设计师的角度而言,其实电脑里的乱数都不是真乱数
而是利用一堆算法让产生的乱数趋近于一种特定的分布(ex: 常态分布)
http://en.wikipedia.org/wiki/Pseudorandom_number_generator
有兴趣可以参考以上wiki或是有关pseudo random 有关的paper
=======================若非算法领域的,以上当题外话=========================
===========================接着是关于程式本身=================================
一般常用的程式语言都会有提供有关乱数的Library
像是C/C++:的rand() (在stdlib.h内)
Java的java.util.Random (若想用简易版的可以用java.util.Math.random())
可是这些的random()的默认种子是固定的,也就是说利用这些函式呼叫无限次
所得的结果都会是一样的.
所以通常会提供改变种子的参数. C/C++:srand(int seed)
Java: Random r=new Random(long seed)
//或是 r.setSeed(long seed)
不同的seed可能会让random()跑出的结果不一样,但是相同的seed所跑出的结果
一定会一样
一个游戏或程式要在不同的呼叫下产生的结果不同(在游戏方面,就是广义的抽奖)
最快而且最方便的方法就是呼叫有关时间的函式
C/C++: time.h , Java: java.util.Date 或与其相关的 java.sql.Time ......
这两著有提供可以撷取当下时间的资讯
C/C++: time_t time(NULL)
Java: Date now=new Date()
C/C++只提供一些函式,利用函式传的结果得知当下时间,像刚刚的函式结果就是
与1970年1月1日GMT 0时0分0秒 相差的秒数(虽然是用time_t传回,只是可以跟
int相通)
Java则是提供一个class,可以用class内提供的method得取相关资讯.
像是 now.getTime()
这个跟C/C++的函式有点像,只是单位不是秒,是微秒(milliseconds) 回传是long
能够得到一个会随着时间而变化的变量,所以就可以把它拿来当作random的seed
所以以下random的懒人写法就会变这样:
C/C++:
srand(time(NULL));
int result=rand();
Java:
Date now=new Date();
Random r=new Random(now.getTime());
int result=r.nextInt();
但是这样有一个很大的问题,像C/C++里的random(),
因为在同样的时间下(同一秒内),seed会是一样的,所以所得出的结果会一么一样
(同样的,在Java也有相同问题(同一微秒内))
这也是会产生原po第二点的现象
所以一个严谨的乱数种子码不能设得太简易,通常会是一些算式或算法的结合
所以第一和第三的现象也就会产生,
第一现象就是会去纪录玩家的行为做成一个变量与原本seed在进行运算,所以就会
变成玩家做特定的动作会让乱数趋于某些值,当然就一个简便的程式而言.应该会
是很少做这样的trigger
至于第三点就想像的很容易,直接利用机器的unique id(或是帐号的unique id)
与原本的seed一起进行运算
这样子就会产生欧洲和非洲的差异(虽然就社会常理而言,是一个极度不公平
的现象)
当然这样子也会影响到random产生的结果的集中性
作者: gekido   2014-12-12 02:06:00
快推文 不然别人以为我看不懂(?
作者: oscarss07 (XDOrz)   2014-12-12 02:07:00
恩 跟我想的差不多
作者: miityisy (肉包包二世)   2014-12-12 02:17:00
之前花了点时间了解乱数种子,看到有种在复习的感觉....
作者: officeyuli (yuli)   2014-12-12 02:23:00
乱数种子既然是以秒甚至微秒惨生的 整整一小时或一分钟最好会都抽到好东西啦......我觉得这只是心理上的安慰作用......会特别去记得那些在特定情况下所遇到的......当把全部时间记录下应该就会趋于平均
作者: wohtp (会喵喵叫的大叔)   2014-12-12 02:53:00
我记得以前上计算物理的时候,教授特别警告绝对不要用系统时间当种子不过游戏对乱数品质的要求也许没那么高吧
作者: attacksoil (击壤)   2014-12-12 06:44:00
作者: bakaworu (阵雨)   2014-12-12 09:18:00
微秒当种子我觉得没问题吧同一微秒发生的机会应该不会很高而且也不知道当时的种子是不是大奖
作者: mstar (Wayne Su)   2014-12-12 09:38:00
以前写 BASIC 程式,也有 RANDOMIZE TIMER 指令
作者: mikeneko (三毛猫)   2014-12-12 10:15:00
嗯嗯,跟我想的差不多

Links booklink

Contact Us: admin [ a t ] ucptt.com