作者csihcs (非天夜翔)
看板C_and_CPP
標題Re: [問題] 請問為什麼產生亂數,卻都一樣??
時間Fri Feb 12 17:22:23 2010
※ 引述《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
推 legendmtg:我是用半透明背景.... 02/12 17:23
→ csihcs:哪尼~~我輸了~~faint 02/12 17:25
→ LZong:我也看到了...今天才開透明背景就有好處@@" 02/12 18:08
推 dendrobium:這是防拷貝嗎? 02/12 18:21
→ netsphere:賺P幣 02/12 19:03
推 yu00928:原來可以這樣賺P幣 02/12 19:15
推 carymask:又學到一招… 02/12 19:30
推 x000032001:這樣可以控告洗錢的喔 輸入無意義內文 ID_Finance板 02/12 19:40
推 hilorrk:這一篇文章值 670 元 02/12 20:17
→ nowar100:樓樓上幫我找到了 我剛就在找這條 = = 02/12 21:31
→ nowar100:此風不可長,這次警告一次,下次就秉公處理了 02/12 21:32
→ csihcs:報告,是。下次不敢用了,因為以前不知道這一條。 02/12 21:33
→ MOONRAKER:真是無聊。 02/12 23:51
※ 編輯: csihcs 來自: 211.74.9.2 (02/13 01:14)