产生十个任一乱数

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