偽隨機數的可回溯化 實現策略

2021-09-19 16:50:37 字數 1601 閱讀 7872

偽隨機數的應用很多比如我的世界或者任何乙個擁有世界種子的的程式。

可回溯化的應用一般出現在可進行負值應用的場景下。

舉個簡單的例不拿「我的世界」說了,二維的很複雜,再們說一說一維的,也就是像「神廟逃亡」之類的隨機無盡的跑酷。

但在「神廟逃亡」遊戲中玩家通常會直往乙個方向遷移不會出現回頭的現象,所以也不會用到隨機數的回溯,所以在一般的應用中,選合適的即可,比如...好吧我沒玩過但我做過這種遊戲不然也就會有這篇博文了。

偽隨機的回溯有乙個很難取捨的問題就像魚與熊掌一樣不可兼得,我都想要啊!但沒辦法,現有的情況下我們只能取捨,除非量子程式設計再發展幾年結果演算就不是個事了。

偽隨機數的產生 「偽隨機數是用確定性的演算法計算出來自[0,1]均勻分布的隨機數序列。」

偽隨機數的產生是有序的線性的,一般是不可逆的可逆的話也就沒必要說了。偽隨機數開始需要確定乙個種子數即確定隨機序列的演算開始並生成乙個偽隨機數,之後next()會根據之前生成的偽隨機數再進行上一步操作,這樣的隨機序列就是偽隨機化的。

簡單實現**(很簡單的表示了吧^_^!):

static int seed;

//定義乙個函式進行運算

int random()

//給乙個起始的演算數

void init(int _seed)

main()

話說偽隨機數再一定程度上真是強大,有乙個故事說乙個外星人到地球旅行結果回去時才發現自己的飛船電腦裝不下整個地球上的所有人類文明資料,就在自己的飛船上各種量,最後在飛船上刻了乙個點就將人類所有的文明資料保留了下來,這不是正式其魅力所在嗎?確定乙個規則函式 + 確定乙個種子 + 確定乙個種子長度 == 人類所有的文明資料。不多說了啊畢竟「我的世界」你們不是沒玩過!

那麼想要實現回溯就必須確定起始種子與由這個種子所引導的序列索引,例如第一次設定初始化種子並獲取乙個隨機數那麼當前的序列索引就是1,再next()獲取乙個序列索引就是2,一次類推。這樣我們就能獲取上乙個或者上上乙個的隨機數是什麼了,只需要從起始種子開始演算到當前序列索引 -1 不就是上乙個隨機數嗎?hhh。

那麼有人會問索引到0還怎麼回溯啊?你不能反向演算啊?劃重點啊!「反向演算」,你再給個 (起始種子 * 負一)的種子不就可以繼續走了嗎?演算法不能逆推種子我可以反轉啊!不就相當於整體開始反轉了嗎?這時的序列索引就可以為負了^_^,你現在可以在一維上無限遊走了。 

需要確定:

1.起始種子

2.序列索引

//dir == true 為正向演算

public static int range (int min, int max, bool dir = true) else if (index < 1)

}} else else if (index > 0) }}

return random.range (min, max);}}

偽隨機數的問題

c,c vb,c 中用的隨機數都是偽隨機數,偽隨機數的乙個問題就是取值分布不均勻。比如 如果從100種隨機抽取,如果1和100都是一等獎,但是1和100的出現機率完全不是1 有可能比1 也有可能比1 小.也不知道各種資料庫中的隨機數最終是否也是採用了偽隨機數.目前如果要分布均勻,一般都是用高斯隨機數...

random偽隨機數的生成

昨天一朋友問了下我關於他寫的一段程式的錯誤.其中有乙個問題就是關於隨機數的.他的 如下 c c c code for inti 0 i n i 這裡很明顯他是想輸出一串小於100的隨機的數列.可是執行結果輸出的卻是類似 97,97,97,97,97,30,30,30,30,30,30,30,30,3...

C語言的偽隨機數

一直想好好的系統的學習一下c語言的偽隨機數,今天終於逮到機會了 因此上述的srand unsigned time null 是利用系統時間來初始化隨機種子的。最後來介紹一下重要的乙個函式rand rand函式 標頭檔案 定義函式 int rand void 函式功能 產生隨機數 函式說明 因為ran...