氣泡排序改一下都能成為乙個合理的洗牌演算法。。。。
#include staticint 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 典型情況下,你更感興趣的是用這個函式來返回處在一定範圍內的整數。要返...