[問題]random的問題

Java 課程討論區 -Java 之大家來找碴

版主: 蔡明志, rachel, yuje, benwu

分享到: Facebook

[問題]random的問題

文章吳濟聰 » 週三 10月 17, 2007 11:57 pm

題目是:
輔仁公司為了回饋顧客,希望你幫忙寫一個程式,公司希望用電腦產生一個1到600的整數亂數,如果數字低於(或等於)300則公司致贈300元禮卷,如果數字高於300則公司致贈等值禮卷
你的程式要印出產生整數亂數及致贈的禮券金額

代碼: 選擇全部
double a = Math.random();
double g = (a*1000);
double c = (g >= 600) ? 600 : g ;
System.out.printf("You get : %5.0f\n",c);
double b = (c > 300) ? c : 300;
double e =(b<=1)?1:b;
System.out.printf("Your money is : %5.0f\n",e);


有些邏輯上的問題 (答案看起來沒問題,可是因為機率分配的關係會讓公司吃虧)
誰能找出這些問題並解釋原因
我不是大吳老師,也不是小吳老師,我是Ben老師
http://www.wretch.cc/blog/jitsungbwu
頭像
吳濟聰
資管系教師
 
文章: 976
註冊時間: 週日 9月 17, 2006 8:00 am
來自: 輔大資管系助理教授

Re:[問題]random的問題

文章pp1222 » 週四 10月 18, 2007 12:24 am

題目是:
輔仁公司為了回饋顧客,希望你幫忙寫一個程式,公司希望用電腦產生一個1到600的整數亂數,如果數字低於(或等於)300則公司致贈300元禮卷,如果數字高於300則公司致贈等值禮卷
你的程式要印出產生整數亂數及致贈的禮券金額


代碼: 選擇全部
double a = Math.random();
double g = (a*1000);
double c = (g >= 600) ? 600 : g ;
System.out.printf("You get : %5.0f\n",c);
double b = (c > 300) ? c : 300;
double e =(b<=1)?1:b;
System.out.printf("Your money is : %5.0f\n",e);


================我是分隔線============================
既然是 希望產生1到600的整數亂數 ,那
代碼: 選擇全部
double a = Math.random();
double g = (a*1000);
double c = (g >= 600) ? 600 : g ;

這個片段程式就會有問題啦
double a = Math.random(); /*generate a random number >= 0 and <1 */
那不就都會產生0~0.999(循環小數)的所有可能
在到double g = (a*1000);
就會產生超過600的數字啦
跟題目原意
"公司希望用電腦產生一個1到600的整數亂數"
就有問題啦?

我是覺得應該要再加個double check的條件吧?
大於6以上的亂數去做捨棄?
不曉得對不對嚕
參考參考摟 :D
pp1222
問題很多的小學生
 
文章: 13
註冊時間: 週五 8月 11, 2006 8:24 pm

Re:[問題]random的問題

文章chime » 週四 10月 18, 2007 9:05 am

共襄盛舉
解這題各位或許對此函數有興趣---> Math.floor

想這問題腦細胞會死掉一點,我不想死! (d8)

後來發現不需使用到腦細胞啦!!
Math.random
引用一下:
代碼: 選擇全部
Math.floor(Math.random() * (max - min + 1)) + min;


Google 大神實在大偉大了!!

========== 以下解釋 ============
首先呢,先說明心靈層面

1. 我們寫程式就表示我們想偷懶,所以最好連寫四捨五入的部份也能懶。
2. 要嘛我們找到四捨五入的 function 來呼叫,要嘛找個方便的來用;反正就是要懶到底就是了。
3. 所以我就去找 Google 大神,最後連寫都不用寫了;夠猛吧!哇哈哈哈! (d10)

技術面:
1. floor 你去點我上面那個連結,所以 0.9999 它會丟出 0 這個整數;所以他稍微跟四捨五入有點不一樣。
2. Math.random 函數其實就是 0.0% ~ 99.99% 的意思
3. 例如 Max=12 , Min=4 , 那兩者的量差=> 12-4 =8 ; //意思是說以4為基底,再加8就會到12; 這就是建構式數學
4. 如果你使用了四捨五入函數來取代 floor , 那四捨五入(Math.random * 8 )就有機會出現整數8;
5. 可是此處用的是 floor 函數,所以我們把量差+1, 那 floor(0.0 ~ 8.9999) = 0 ~ 8 溜;(思考一下,如果 min <0 會有問題否?)
6. 參考2,3 重點,既然以百分比*量差的思維來設計,那麼最後再把基底(min)加上去就完成啦。
==== 以上就是該公式的原創意 ====

學程式設計是在吸取別人的思維,教程式設計是在分享思維!
最後由 chime 於 週三 10月 24, 2007 6:52 pm 編輯,總共編輯了 6 次。
頭像
chime
懷疑的國中生
 
文章: 57
註冊時間: 週四 8月 23, 2007 9:09 am

Re:[問題]random的問題

文章吳濟聰 » 週二 10月 23, 2007 3:14 pm

Chime,

能不能解釋一下為什麼這樣寫?
我不是大吳老師,也不是小吳老師,我是Ben老師
http://www.wretch.cc/blog/jitsungbwu
頭像
吳濟聰
資管系教師
 
文章: 976
註冊時間: 週日 9月 17, 2006 8:00 am
來自: 輔大資管系助理教授

Re:[問題]random的問題

文章chime » 週三 10月 24, 2007 10:03 am

推一下好了!不然會以為沒回 (d25)
頭像
chime
懷疑的國中生
 
文章: 57
註冊時間: 週四 8月 23, 2007 9:09 am


回到 Java 之 大家來找碴

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客

cron