自己想的,希望磚家斧正演算法模擬現實中洗牌
單副牌(54張),放在牌座上,給一副牌每張牌標定乙個層,一副牌最低端的是第0層,最上面的是第53層,那麼所有牌的所在的層就固定了。
例如:紅桃a,在洗牌之前,在撲克牌的第5層(這裡相對的撲克牌的第0層是最低下的一張牌,當然也可是最上面的一張牌,這是乙個參照問題),洗完後可能就是在第53層。再洗一次可能就是在第6層。
總而言之洗牌其實就是隨即每張牌的所在層數,每張牌所得的所在層數,下面我們稱之為牌的層屬性,
第一種情況,所有牌的層屬性都不行同,0-53;
第二種情況是,所有牌的層屬性允許相同,先隨即得到層屬性的牌優先在最上面,層屬性越大的優先在最上面。
第一種情況就不用說了
我主要是說的第二種情況,例如,在某次隨即過程中,紅桃a的層屬性的值是2, 紅桃k的也是2,紅桃9的也是2,梅花3的也是2,小王的也是2。
那麼牌所在層數由高到低相對就是
2,2,2,2,2,2
紅桃a,紅桃k,紅桃9,梅花3,小王
當然在現實洗牌中,每張牌的層數隨著洗牌次數的增加,撲克牌的層屬性就有所改變,也就是說洗牌過程中變化的是每張撲克層屬性
class card
int layer;//層屬性
int dot;//牌的點數
這裡的變化就是單張撲克牌的所在層,也就是撲克牌的層屬性的變化;
初始化54張牌
card crd = new card[54];
random rnd= new random();
for(int i=0;icrd[i].dot =i;
crd[i].layer =rnd.next(1,55);
//對層數進行排序。這裡的排序也很關鍵,我用的是改進的冒泡法排序的
sortbylayer(ref crd);
void sortbylayer(ref card crds)
card tmpcrd;
int nl = crds.length-1,kl;
for(int i=0;ifor(int j=0;jif(crds[j].layer>crds[j+1].layer)
tmpcrd = crds[j];
crds[j]=crds[j+1];
crds[j+1] = tmpcrd;
kl=j;
nl=kj;
if(nl==0)break;
用這個演算法也可以模擬隨機數的生成,產生1-100的不重複的隨機數,就可以用上面的思想,over
生成不重複的隨機數
思想是用乙個陣列來儲存索引號,先隨機生成乙個陣列位置,然後把這個位置的索引號取出來,並把最後乙個索引號複製到當前的陣列位置,然後使隨機 數的上限減一,具體如 先把這100個數放在乙個陣列內,每次隨機取乙個位置 第一次是1 100,第二次是1 99,將該位置的數用最後的數 代替。int index n...
不重複隨機數生成
直接上 生成 0,total 的隨機數 最大隨機數 ilist private static ilistgetrandomsequence int total random random new random for var i listbase.count 1 i 0 i return listo...
C 生成不重複的隨機數
在做洗牌演算法的時候用到了隨機數,並且產生的隨機數中不能有重複的元素,因為是用c語言實現的,就把值賦給陣列,然後用隨機數產生陣列的下標,每產生乙個就刪除對應的元素,然後隨機數的生成範圍減一,但是這樣做每次都要迴圈去移動陣列元素,從時間複雜度上來說這樣並不好。於是,後來用c 重新實現 實現的思路並沒有...