如何產生1-100
之間的100個不重複的隨機數
如果這是你是第一次看到這個題目,也許你的想法有很多。
1:首先從原始陣列中隨機選擇乙個數字,然後將該數字從陣列中剔除,再隨記選,再剔除,重複99次,就解決了。
我們知道從陣列中剔除乙個元素的複雜度為o(n),那麼隨機選取n個數字,它的複雜度就是o(n2)了。
2:用hash作為中間過濾層,因為在陣列中,我們採用隨機數的話,也許隨機數在多次隨機中可能會有重複,所以需要用hash來判斷一下,
如果在hash中重複,則繼續產生隨機數,直到不重複為止,當然這個複雜度就不好說了,得要看隨機數隨機不隨機了,好的話,o(n)搞定,
不走運的話無上限~
可以對應到的就是「洗撲克牌」,在演算法中也叫「洗牌原理」,我們知道洗撲克牌的方式就是隨機的交換撲克牌的位置,又叫做"切牌",當你切了
很多次後,我們的撲克牌就可以認為是足夠亂了,複雜度也就變成了o(n),用**實現就是這樣的。
<1> 先有序的生成52張牌,然後有序的放到陣列中。
<2>從1-52中隨機的產生乙個數,然後將當前次數的位置跟隨機數的位置進行交換,重複52次,我們的牌就可以認為足夠亂了。
4:**實現
<1> 首先定義牌的資料結構,定義乙個「花色」和「數字」
1 /// 2 ///具體撲克牌<2>有序的生成52張牌3 ///
4 public classcard
5
1 /// 2 ///開牌<3> 然後就是切牌了,剛才也說了思路,就是拿隨機數的位置與當前i的位置進行交換,不過一說到交換就想起了「氣泡排序」,可能被毒害太3 ///
4 public voidnewcard()
5 21
22 card[i - 1] = newcard()
23 ;
27 }
28 }
深了(┬_┬),不知道你感覺到了沒。
1 /// 2 ///洗牌<4> 最後我們看看效果3 ///
4 public voidshuffle()
5 19 }
1 usingsystem;2 usingsystem.collections.generic;
3 usingsystem.linq;
4 usingsystem.text;
5 usingsystem.threading.tasks;
6 8
27 }
28 29 public classcardclass
30 42
43 /// 44 ///開牌
45 ///
46 public voidnewcard()
47 63
64 card[i - 1] = newcard()
65 ;
69 }
70 }
71 72 /// 73 ///洗牌
74 ///
75 public voidshuffle()
76 {
77 for (int i = 0; i < card.length; i++)
78 {
79 var rand = new random((int)datetime.now.ticks).next(0, card.length);
80 81 //因為隨機數是偽隨記,正真的隨機數是要跟硬體打交道的,所以這裡設定了停留1ms
82 system.threading.thread.sleep(1);
83 84 var temp =
如何產生1 100 之間的100個不重複的隨機數
1 首先從原始陣列中隨機選擇乙個數字,然後將該數字從陣列中剔除,再隨記選,再剔除,重複99次,就解決了。我們知道從陣列中剔除乙個元素的複雜度為o n 那麼隨機選取n個數字,它的複雜度就是o n2 了。2 用hash作為中間過濾層,因為在陣列中,我們採用隨機數的話,也許隨機數在多次隨機中可能會有重複,...
輸出1 100之間的素數
思路 取出1 100,寫乙個布林型別的的方法判斷是不是素數,是素數就輸出。判斷是不是素數的方法是 如果是 1直接返回 false,不是1 時,先得到該數的 2次方根,從 2開始遍歷直到該數的 2次根。如果取到的數能把 2到該數的 2次方根之間的數除盡,就不是素數,除不盡就是。能被2除盡的就不是質數。...
1 100之間 7 的倍數的個數,並列印
7的倍數 x 7 0 偶數的話 x 2 0 1 package com.ibeve.demo 23 4 2.1 100之間 7 的倍數的個數,並列印 5 思路 6 1.先對 1 100進行迴圈 遍歷 通過迴圈的形式 7 2.在遍歷的過程中,定義條件,只對7的倍數進行操作 8 3.因為 7 的倍數不確...