Re: [承上面]67個if的美學果然不適合小弟...
※ 引述《JazzChen (PhoenixJazz)》之銘言:
: 小弟在前一篇發表了67個if
: 一時之間成了版標...太令小弟震驚了!
: 不過小弟不是個"勤能補拙"的人,無法好好地寫完67個if
: 最後綜合了各家說法以及小弟個人(翻書)的見解,
: 在此放上小弟腦力激盪後的寫法
: 請各位大大賜教!希望能夠再增進JAVA的功力!
: 默默附上:
: //random number
: int[] D = new int[4];
: D[0] = (int) (Math.random()*10);
: do{
: D[1]=(int) (Math.random()*10);
: } while(D[0] == D[1]);
: do{
: D[2]=(int) (Math.random()*10);
: } while(D[0] == D[2] || D[1] == D[2]);
: do{
: D[3]=(int) (Math.random()*10);
: } while(D[0] == D[3] || D[1] == D[3] || D[2] == D[3]);
我來補充個出發點不太一樣的作法。
先產生好按照順序排列的數字,然後對數列作洗牌的動作。
int n = 10;
int[] D = new int[n];
for (int i=0; i<n; i++) D[i] = i;
for (int i=0; i<n; i++) swap(D, i, (int) (Math.random()*n));
猜數字只需要四個數字,所以就取前四個數字出來用即可。
swap 顧名思義就是交換陣列中兩個元素的位置,實作就不貼上來了 :p
洗牌所用的演算法叫做 Fisher-Yates shuffle,
Wikipedia 上有非常詳盡的說明:
http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
不過別被它嚇到了,
實際上就只是依序將第 i 個元素與 random 位置的元素作交換。
(至於這樣洗牌洗得乾淨嗎?請參閱 Wikipedia)
相同的想法,如果能善用 Java 內建的 API,就可以寫成這樣。
int n = 10;
List<Integer> list = new ArrayList<Integer>();
for (int i=0; i<n; i++) list.add(i);
Collections.shuffle(list);
我不太確定這些東西對你來說是否會太難,只是希望能再多刺激你一下 (笑)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.78.231
※ 編輯: tkcn 來自: 140.114.78.231 (10/17 01:40)
→
10/17 07:34, , 1F
10/17 07:34, 1F
推
10/17 15:05, , 2F
10/17 15:05, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 8 篇):