跳蚤演算法:基本原理。
一、演算法的誕生及設計初衷。
傳統教材中取得x個0 to n之間不重複隨機數的方法一般是這樣:
(x個不重複隨機數輸出到a()陣列)
for i=1 to x
dor=int(rnd*(n+1))
c=《確定r不包含在a()內》
loop until c
《將r新增到a()>
next
由於r可能與a()內的值重複,且每次迴圈都要歷遍a(),因此該演算法的效率很低。而且r是否命中到a()存在一定的隨機性,取得乙個合適的r要迴圈多次(次數不確定),從運算時間上來說是不可預見的。
不重複隨機數是編寫程式經常需要的演算法。因此,出於高效、穩定的需要,通過對撲克洗牌的觀察,設計出如下演算法。由於不清楚這個演算法的學名,因其在工作時數值隨機交換,好似跳蚤一樣跳來跳去的,因此給它取個有趣的名字叫「跳蚤演算法」,並在csdn的vb版多次提供。
「跳蚤演算法」有許多改進方式及應用方法。以下僅是最基本的「跳蚤演算法」,以便於描述這個演算法的原理。
這個演算法的優點在於運算時間穩定、高效,缺點是需要大量的儲存空間。需要的空間與n的取值有關。通常情況下,如果您要從s to e的範圍內選擇x個隨機數,假如e-s的絕對值大於10000000一般我不推薦您使用這個演算法。如果這個絕對值大於2000000000,在vb下是難以做到的。
該演算法原則上不適用於浮點數。
二、跳蚤演算法原理
a()為乙個陣列,元素上下標符合a(0 to n)的理想狀態。在0 to n範圍內取得x個隨機數,(x<=n)
i為陣列元素的當前索引
r為乙個隨機數 r。(0<=r<=n)
1、首先需要為陣列賦值,打亂乙個所有值都一樣的陣列是沒有意義的。
for i=0 to n
a(i)=i
next
2、打亂原有順序排列的陣列元素值。
for i=0 to n
r=int(rnd*(n+1))
swap a(i),a(r)
next
sub swap(v1,v2)
'交換兩值
t=v1:v1=v2:v2=t
end sub
3、獲取x個不重複隨機數,輸出到b()裡面。
for i=1 to x
b(i)=a(i-1)
next
RSA演算法基本原理
圖為 rsa公開金鑰演算法的發明人,從左到右ron rivest,adi shamir,leonard adleman.攝於1978年 素數是這樣的整數,它除了能表示為它自己和1的乘積以外,不能表示為任何其它兩個整數的乘積。例如,15 3 5,所以15不是素數 又如,12 6 2 4 3,所以12也...
mysql的基本原理 Mysql 基本原理
mysql 基本原理 mysql是一種關聯式資料庫管理系統,關聯式資料庫將資料儲存在不同的表中,而不是將所有資料放在乙個大倉庫內,這樣就增加了速度並提高了靈活性 ysql是資料庫登入命令 uroot預設超級使用者登入 p 預設沒密碼 中寫密碼 mysqladmin uroot password 12...
ARA 演算法的基本原理
在介紹ara 演算法之前,有必要介紹一下weighted a 演算法,在最初的a 演算法中,f s 的計算方法為 f g h可以看出f s 是由個g s 和h s 兩項構成的,其中g s 是乙個後驗值,而h s 是乙個先驗值,這樣一種啟發式的搜尋方式本身為演算法本身節省了很多資源,去除了一些不必要點...