產生十個任一亂數

Home Home
引用 | 編輯 csr
2011-03-23 21:29
樓主
推文 x0
有一題目
要產生10個-9,-4,1,......,101之任一亂數
小弟只曉得隨意產生
但是指定要在差5的情形下
真的是想了老半天
就是寫不出來
底下是小弟的程式
請 ..

訪客只能看到部份內容,免費 加入會員



獻花 x0
引用 | 編輯 totsi
2011-03-24 08:43
1樓
  
要有X5..那看起來不像是亂數阿~XD

但如果是要再-9~101之間取亂數的話,那有個前輩講的『撲克牌取排』作弊的方式可以參考。

就是一開始先建立存有-9~101的陣列。

之後在此陣列的邊界內隨機取亂數的索引值。
例如:
1.陣列內,每個值的索引為Index(-9) = 0, Index (-4) = 1, ...., Index(101) = 23。
2.針對0~23取整數的亂數。
3.如有抓到同一個索引值,則在重新抓。
4.抓到10個索引值後,再把先前存於陣列內,對應於的值取出就好。

不知是否有符合您的需求?

不過話說,如果每個亂數都X5的話,那麼比較像是等差級數值吧XDD

獻花 x1
引用 | 編輯 csr
2011-03-24 17:20
2樓
  
下面是引用 totsi 於 2011-03-24 08:43 發表的 : 到引言文
要有X5..那看起來不像是亂數阿~XD

但如果是要再-9~101之間取亂數的話,那有個前輩講的『撲克牌取排』作弊的方式可以參考。

就是一開始先建立存有-9~101的陣列。

之後在此陣列的邊界內隨機取亂數的索引值。
例如:
1.陣列內,每個值的索引為Index(-9) = 0, Index (-4) = 1, ...., Index(101) = 23。
2.針對0~23取整數的亂數。
3.如有抓到同一個索引值,則在重新抓。
4.抓到10個索引值後,再把先前存於陣列內,對應於的值取出就好。

不知是否有符合您的需求?

不過話說,如果每個亂數都X5的話,那麼比較像是等差級數值吧XDD

小弟也不是很清楚
因為才剛學指標與陣列
而且又是自修學習
跟本沒先進可請教
不過還好在此版塊有大大肯不辭勞苦的教導小弟
心中也確實感念不少
所以依大大指引的方向再試看看寫不寫的出來
若不行再向大大討教
謝謝指導

獻花 x0
引用 | 編輯 csr
2011-03-25 21:22
3樓
  
請教大大們
小弟這樣寫為何無法編譯
可否幫忙找問題
或者小弟那裡錯了
謝謝

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
  int i,j;
  int array[23];
  int index(-9)=0,index(-4)=1,index(1)=2,index(6)=3,index(11)=4,index(16)=5,
    index(21)=6,index(26)=7,index(31)=8,index(36)=9,index(41)=10,index(46)=11,
    index(51)=12,index(56)=13,index(61)=14,index(66)=15,index(71)=16,
    index(76)=17,index(81)=18,index(86)=19,index(91)=20,index(96)=21,
    index(101)=22;
  srand((unsigned)array[23]);
  for(i=1;i<=10;i+=1)
  {
  for(j=-9;j<=101;j+=5)
    {
    array[23]=j;
    j=rand()%23+0;
    printf("%d. %d\n",i,j);
    }
  }
  system("pause");
  return 0;
}

獻花 x0
引用 | 編輯 totsi
2011-03-28 09:34
4樓
  
請貼出compiler顯示給您的錯誤訊息嚕^^m

如果找不到要到哪邊看,請按View->Other Window->Error List,裡面會告訴您無法編譯的原因。

這樣幫您找問題的人會比較方便 表情

獻花 x0
引用 | 編輯 csr
2011-03-28 17:11
5樓
  
下面是引用 totsi 於 2011-03-28 09:34 發表的 : 到引言文
請貼出compiler顯示給您的錯誤訊息嚕^^m

如果找不到要到哪邊看,請按View->Other Window->Error List,裡面會告訴您無法編譯的原因。

這樣幫您找問題的人會比較方便 表情
大大您好
上面程式有底下錯誤
expected `,' or `;' before '=' token
小弟再怎麼改都沒用
後來索性小弟將它改成下面這樣
它是可以產生十個亂數
但是都是一成不變的亂數
不知那兒有問題
是否可請大大幫小弟診斷問題所在
謝謝您
以下是所改的程式碼

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
  int i,j;
  int num[23]={-9,-4,1,6,11,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96,101};
  srand(num[23]);
  for(i=1;i<=10;i++)
  {
  for(j=0;j<=22;j++)
      {
      num[j]=(-9,-4,1,6,11,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96,101);
      j=rand()%22+0;
      printf("%d. %d\n",i,num[j]);
      break;
      }
  }
  system("pause");
  return 0;
}

獻花 x0
引用 | 編輯 totsi
2011-03-29 17:48
6樓
  
亂數都一致的問題是您的Random seed給的都一樣,所以每次都會產生相同的數值。

亂數在下不熟練,只知道最簡單的方法是把時間拿來當seed來產生新亂數。

至於時間要取到多少,會建議到10ms以下,不過也是要看您的需求而定。

至於compile錯誤的問題,可能是因為在c/c++裡面,陣列的使用是用 [] 來指定陣列位置。所以用 () 就會出錯。

您可以修改看看,說不定會有效。

關於Index(-9) = 0指的是Index函式傳入-9,他會回傳陣列位置0。

所以是屬於數學表示的方式,造成您的誤會,很不好意思。

會建議您先把程式流程用文字敘述先建立好,之後再程式碼,會比較清楚流程。

例如:
1.建立存放-9~101,間距為5的23三個數值的陣列。
2.產生0~23之間之整數亂數
3.確認產生之亂數是否有重複產生
4.....
5.....

以此列推,說不定會對您有幫助^^m

獻花 x2
引用 | 編輯 csr
2011-03-30 15:40
7樓
  
下面是引用 totsi 於 2011-03-29 17:48 發表的 : 到引言文
亂數都一致的問題是您的Random seed給的都一樣,所以每次都會產生相同的數值。

亂數在下不熟練,只知道最簡單的方法是把時間拿來當seed來產生新亂數。

至於時間要取到多少,會建議到10ms以下,不過也是要看您的需求而定。

至於compile錯誤的問題,可能是因為在c/c++裡面,陣列的使用是用 [] 來指定陣列位置。所以用 () 就會出錯。

您可以修改看看,說不定會有效。

關於Index(-9) = 0指的是Index函式傳入-9,他會回傳陣列位置0。

所以是屬於數學表示的方式,造成您的誤會,很不好意思。

會建議您先把程式流程用文字敘述先建立好,之後再程式碼,會比較清楚流程。

例如:
1.建立存放-9~101,間距為5的23三個數值的陣列。
2.產生0~23之間之整數亂數
3.確認產生之亂數是否有重複產生
4.....
5.....

以此列推,說不定會對您有幫助^^m
因為習題的指定
所以才會弄得小弟焦頭爛額
以下小弟再多參考一些書籍或網路問題查詢
看能不能完全解決
謝謝

獻花 x0
引用 | 編輯 csr
2011-04-04 15:32
8樓
  
終於解決了這一題
該題程式碼如下
可以產生十個指定亂數

#include<stdio.h>
#include<stdlib.h>
#include <time.h>
int main(void)
{
  int i,j;
  srand((unsigned)time(NULL));
  int num[23]={-9,-4,1,6,11,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96,101};
  for(i=1;i<=10;i++)
  {
  for(j=1;j<=22;j++)
    {
    num[j]=(-9,-4,1,6,11,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96,101);
    j=(rand()%23)+1;
    printf("%d. %d\n",i,num[j]);
    break;
    }
  }
  system("pause");
  return 0;
}

獻花 x0
引用 | 編輯 leacks
2011-04-10 08:45
9樓
  
23個亂數?
既然是-9~101
那就把取到的亂數-9不就好了?

rand()%111-9

也不用建啥陣列了
不然就是要用程式建陣列,否則為了這簡單的小程式花時間在那邊建110個陣列,有點浪費時間.

獻花 x2
引用 | 編輯 csr
2011-04-10 18:53
10樓
  
下面是引用 leacks 於 2011-04-10 08:45 發表的 : 到引言文
23個亂數?
既然是-9~101
那就把取到的亂數-9不就好了?

rand()%111-9

也不用建啥陣列了
不然就是要用程式建陣列,否則為了這簡單的小程式花時間在那邊建110個陣列,有點浪費時間.
亂數它有指定在-9-101中間相隔+5的不連續數
因此不能依大大的方法
因為如此它就無法在指定的數目中產生亂數
所以依totsi大大的提示
終於如願以償
寫成如上程式碼
所以很感謝totsi大大之臨門一腳

獻花 x0
引用 | 編輯 totsi
2011-04-13 11:42
11樓
  
其實Leacks大所說的用程式建陣列是可行的..因為你是固定間距。

底下的code你可以玩玩看,我沒有測過是否可以complie,如有錯誤的話,可以試著解決:
複製程式
int nArrIndex = 0;    //存放陣列的索引
int *narray = new int(23);   //建立陣列

for ( int i = -9 ; i <= 101 ; i + 5 )
{
  if ( nArrIndex > 22 )  {  //陣列邊界檢查
    break; };
  narray[nArrIndex] = i;
   ++nArrIndex;             
}

之後的取值的方式,就跟一般陣列的作法一樣。

獻花 x0
引用 | 編輯 leacks
2011-04-13 21:33
12樓
  
其實等差是可以靠數學公式.
樓上的方法算是自動建陣列,算是一個好處.

但無論室等差or等比都有公式.
因此只要改變要取第幾個值,自然還是ok,不一定要建陣列
===
因為我想這是練習題.
越多方法的告知,能對新手有更多的刺激.
畢竟程式沒有絕對的好,以及絕對的不好.但越多方法可以選時,你未來的撰寫條件就越廣泛.

獻花 x0
引用 | 編輯 csr
2011-04-14 10:38
13樓
  
小弟回家後'
會照兩位大大的說法
再作進一步思考
謝謝

獻花 x0
引用 | 編輯 tw2twtw
2011-11-24 23:23
14樓
  
如果指定要差5的話,可以亂數加減1 的數字然後乘於5.....

獻花 x0
引用 | 編輯 iamboss123
2014-01-12 14:35
15樓
  
簡單的方法是把時間拿來當seed來產生新亂數。

獻花 x0