由洗牌想到的不重複隨機數的生成

2021-05-11 09:50:04 字數 1236 閱讀 7223

自己想的,希望磚家斧正演算法模擬現實中洗牌

單副牌(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 重新實現 實現的思路並沒有...