不使用隨機數的洗牌演算法

2021-09-06 11:38:01 字數 867 閱讀 9354

氣泡排序改一下都能成為乙個合理的洗牌演算法。。。。

#include static

int a[56

];int

main()

}for(int i = 0; i < 56; ++i)

std::cout

<< a[i] << "";

std::cout

<}

}

「在演算法不公開的情況下,產生乙個足夠亂的序列。」

或者說雖然是固定演算法,但黑盒下難以猜出。

比如54張牌編號0~53後,對於乙個初始序列,用氣泡排序。

兩個元素交換的條件不是比大小,而是看和是不是2的倍數。

(或者第一輪冒泡看是不是2的倍數,第二輪看是不是3的,如此下去)

諸如此類的條件。

最後得到的序列,不寫出**估計很難弄清楚。

看法:氣泡排序是採用比較大小的方法排序,比較a[i]與a[j]的大小,然後交換位置。

如果把這個比較大小的邏輯更改一下,就可以排列出不同的結果。

比如給定乙個常數 int n = 100 比較 a[i] % n 與 a[j] % n的大小,就可以得出乙個比較奇怪的序列。

每次執行洗牌程式時,n取不同的數字,第一次100,下一次可以101, 102等等,就可以得到不同的洗牌結果了

總結了了下,可以用以下三種方式:

1.取時間或記憶體資訊,得到的量是隨機的,簡單的如gettickcount()%54;

2.使用執行緒,簡單的如開乙個執行緒迴圈++i,主線程中sleep一段時間(這個時間還可以用i的值來控制,每次sleep時間都不一樣,加大了隨機性)後,再得到子執行緒中i的值為隨機值;

3.人為干預,簡單的比台滑鼠滑動、迴圈執行等待按鍵得到隨機值;

如何得到多個不同的隨機數 洗牌演算法

先來思考乙個問題 有乙個大小為 100 的陣列,裡面的元素是從 1 到 100 按順序排列,怎樣隨機的從裡面選擇 1 個數?最簡單的方法是利用系統的方法math.random 100,這樣就可以拿到乙個 0 到 99 的隨機數,然後去陣列找對應的位置就即可。接下來在思考乙個問題 有乙個大小為100的...

演算法 隨機數

include include include 功能,隨機生成n個隨機數,並按公升序排序 int main void printf 從小到大排列為 n for i 0 i for i 0 i printf 4d arr i return0 這裡生成隨機數的關鍵 includesrand unsign...

隨機數使用

函式rnd 是乙個非常重要的函式。如果你想建立乙個隨機的問候語,乙個日期的隨機提示,或者甚至乙個遊戲,你將要使用這個函式。函式rnd 返回乙個0到1之間的隨機數。這裡有這個函式的乙個例子及其可能的返回值 rnd 0.7055643 典型情況下,你更感興趣的是用這個函式來返回處在一定範圍內的整數。要返...