Re: [問題] 請問為什麼產生亂數,卻都一樣??
※ 引述《iversonjimmy (Effort)》之銘言:
: 不好意思,之前我有po一篇類似亂數但保證不重複的程式碼,
: 後來有和朋友討論後,想到的解決辦法的概念是,
: 將亂數存到陣列中,當產生一筆亂數值後,會和之前的前幾筆做比較,
: 如果發生重複,該筆亂數值會重新計算,並再做比較,
: 不過程式在執行後,還是會發生重複的情形(雖然機率不高XDD),不知道哪裡出了錯...
: 程式碼可能有點長,希望各位能見諒,幫我找蟲...先跟妳們說聲謝謝。
: #include <stdio.h>
: #include <stdlib.h>
: #include <string.h>
: #include <time.h>
: int main(void)
: {
: char name[40][80];
: int count=0;
: int number1[10];
: int length,number,i,j,number2;
: int onetimestate;
: srand(time(NULL)); //一定要加入此程式碼
: printf ("請輸入字串,最多40筆,按 enter 即離開。\n");
: while (count<40)
: {
: printf ("請輸入第%d個字串: ",count+1);
: gets(name[count]);
: length=strlen(name[count]);
: if(length==0)
: break;
: count++;
: }
: printf ("您總共輸入了%d個字串\n",count);
: if (count%2==0)
: number=count/2;
number 未必 initialized,請注意。
: for (i=0;i<number;i++)
: {
: number1[0]=(rand()%count+1);
你把這行 number1[0] 放在這,
會讓每次 loop 都會被改變 number1[0] 的值,
我建議你把這行拿到 for-loop 外,
從 i = 1 開始
而下面 if( i > 0 ) 可以省略。
如此就可以避免妳說的問題。
: if (i>0)
: {
: onetimestate=0;
: do
: {
: number2=(rand()%count+1);
: onetimestate=0;
: for (int j=0;j<i;j++)
: {
: if (number1[j]==number2)
: onetimestate=1;
: }
: }while (onetimestate==1);
: number1[i]=number2;
: }
: }
: for (i=0;i<number;i++)
: {
: printf ("%d\n",number1[i]);
: }
: system ("pause");
: return 0;
: }
最後建議你再可以爬爬文,
以前有蠻多高手提到怎麼取出不重複的亂數,
常見的是洗牌法,當然你同學說的也是一種,
不過在你取的數量超過母體數量的一半之後,
會花較多執行時間來檢查重複與重新取亂數,
舉例來說,你有20個相異的人名要取出15個,
當你要取第15個時,你重複的機率為14/20,
而你卻必須要從頭檢查到第14個是否有相同,
若相同又必須要重新取亂數一次,再做檢查,
這實在令人感到這會花費非常多的時間在這,
然而這一切都會是跟你自己的需求有所關係,
因為如果你只要取出少量而不重複的亂數值,
那麼洗牌法就會浪費過多記憶體空間來完成,
故還是需要由你自己來決定哪種方法較適合。
其實講了那麼多只是要騙騙P幣,我是嫩咖。
謝謝各位大大還是那麼認真的看完。m(_@_)m
這裡是騙P幣的最後一行。謝謝收看。
--
希望消失到自由的風中,
渴望解除掉束縛的羈絆。
期望悄悄的消失在風中,
感受那沒有羈絆的自由。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.74.9.2
推
02/12 17:23, , 1F
02/12 17:23, 1F
→
02/12 17:25, , 2F
02/12 17:25, 2F
→
02/12 18:08, , 3F
02/12 18:08, 3F
推
02/12 18:21, , 4F
02/12 18:21, 4F
→
02/12 19:03, , 5F
02/12 19:03, 5F
推
02/12 19:15, , 6F
02/12 19:15, 6F
推
02/12 19:30, , 7F
02/12 19:30, 7F
推
02/12 19:40, , 8F
02/12 19:40, 8F
推
02/12 20:17, , 9F
02/12 20:17, 9F
→
02/12 21:31, , 10F
02/12 21:31, 10F
→
02/12 21:32, , 11F
02/12 21:32, 11F
→
02/12 21:33, , 12F
02/12 21:33, 12F
→
02/12 23:51, , 13F
02/12 23:51, 13F
※ 編輯: csihcs 來自: 211.74.9.2 (02/13 01:14)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):