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