引用 | 编辑
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 发表的 : 小弟也不是很清楚 因为才刚学指标与阵列 而且又是自修学习 跟本没先进可请教 不过还好在此版块有大大肯不辞劳苦的教导小弟 心中也确实感念不少 所以依大大指引的方向再试看看写不写的出来 若不行再向大大讨教 谢谢指导 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 发表的 :大大您好 上面程式有底下错误 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 发表的 :因为习题的指定 所以才会弄得小弟焦头烂额 以下小弟再多参考一些书籍或网路问题查询 看能不能完全解决 谢谢 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 |
引用 | 编辑
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 |
引用 | 编辑
iamboss123
2014-01-12 14:35 |
15楼
▲ |
简单的方法是把时间拿来当seed来产生新乱数。
x0 |