|
![]() | 作者: sniper167 [sniper167]
![]() |
登录 |
int i,t[10],temp; for (i=0;i<10;++i) t[i]=i; for (i=0;i<4;++i) { index=i+rand()%(10-i); temp=t[i]; t[i]=t[index]; t[index]=temp; } //t[0]~t[3]即为四位不重复随机数。 ------------------------------------------------ for (i=0;i<4;++i) { index=i+rand()%(10-i); temp=t[i]; t[i]=t[index]; t[index]=temp; } 这段看不大懂,哪位解释一下,感谢!!! [此贴被 啥都不会(sniper167) 在 04月27日17时19分 编辑过] |
地主 发表时间: 04-04-27 17:14 |
![]() | 回复: sniper167 [sniper167] ![]() |
登录 |
再问一个: srand(time(NULL)); for(i=0;i<4;i++) { a[i]=rand()%10; for(j=0;j<i;j++) if(t[j]==a[i]) { a[i]=rand()%10; j=0; } //以上几行程序是保证四个数字不重复。 t[j]=a[i]; ---------------------------------------------------- 为什么比较后重新生成的随机数还是有可能与原来的数相同(虽然几率很小)????? 感谢各位。。。 [此贴被 啥都不会(sniper167) 在 04月27日17时20分 编辑过] |
B1层 发表时间: 04-04-27 17:19 |
![]() | 回复: xiaoshi [xiaoshi] ![]() |
登录 |
for (i=0;i<4;++i) { index=i+rand()%(10-i);//i+随机数与(10-i)取余 temp=t[i];//后面好象就是交换位置了 t[i]=t[index]; t[index]=temp; } ***** index 的值可以确保小于10吗? 我知道的不多 |
B2层 发表时间: 04-04-27 18:30 |
![]() | 回复: sniper167 [sniper167] ![]() |
登录 |
呵呵 感谢 看来你知道的和我知道的差不多 期待达人出现。。。 |
B3层 发表时间: 04-04-27 21:27 |
![]() | 回复: lida1818 [lida1818] ![]() |
登录 |
for (i=0;i<4;++i) { index=i+rand()%(10-i);//rand()%(10-i) i是0~3四个数,10-i就是10,9,8,7 则i+rand()%(10-i)就是 <=9 数,等价 random(10) 这里大概是想增加随机性吧 // 0<=index<=9 temp=t[i]; t[i]=t[index]; t[index]=temp; //以上产生的数为下标,与t[0]~t[3]交换内容 } 该程序的算法:t[]中值是不重复的0~9,该程序的算法将t[0]~t[3]与 t[0]~t[9]交换 index不会大于9,如:i=3,[rand()%(10-3)=rand()%7]<=6 |
B4层 发表时间: 04-04-27 21:41 |
![]() | 回复: lida1818 [lida1818] ![]() |
登录 |
srand(time(NULL)); for(i=0;i<4;i++) { a[i]=rand()%10;\\a[i]被赋一个随机值 for(j=0;j<i;j++) if(t[j]==a[i])\\比较t[0]~t[i-1]是否与a[i]相等,相等则重新给a[i]赋一个随机值 { a[i]=rand()%10; j=0;//注意,j=-1重新比较,否则t[0]不参与比较 } t[j]=a[i];//如果没有重复 [此贴被 烟雨平生(lida1818) 在 04月27日23时08分 编辑过] |
B5层 发表时间: 04-04-27 21:53 |
![]() | 回复: sniper167 [sniper167] ![]() |
登录 |
感谢烟老兄![]() |
B6层 发表时间: 04-04-27 23:24 |
![]() | 回复: xiaoshi [xiaoshi] ![]() |
登录 |
谢了 有上了一课 以后多多益善 |
B7层 发表时间: 04-04-28 15:47 |
![]() | 回复: sniper167 [sniper167] ![]() |
登录 |
for (i=0;i<4;++i) { index=i+rand()%(10-i);//rand()%(10-i) i是0~3四个数,10-i就是10,9,8,7 则i+rand()%(10-i)就是 <=9 数,等价 random(10) 这里大概是想增加随机性吧 // 0<=index<=9 temp=t[i]; t[i]=t[index]; t[index]=temp; //以上产生的数为下标,与t[0]~t[3]交换内容 } ================================================================================= index=i+rand()%(10-i): i=0,10-i=10,求余后为一个 0 到 9 的数,再加 i ,则为一个 0 到 9 的数 i=1,10-i=9,求余后为一个 0 到 8 的数,再加 i ,则为一个 0 到 9 的数 i=2,10-i=8,求余后为一个 0 到 7 的数,再加 i ,则为一个 0 到 9 的数 i=3,10-i=7,求余后为一个 0 到 6 的数,再加 i ,则为一个 0 到 9 的数 可是a[i]=rand()%10;也能产生同样的结果,上面的好象多此一举了???为何还要这样??不解。。。 [此贴被 啥都不会(sniper167) 在 04月28日20时50分 编辑过] |
B8层 发表时间: 04-04-28 20:42 |
![]() | 回复: sniper167 [sniper167] ![]() |
登录 |
我的二个问题还没解决,哪位兄弟顶上? 感谢 |
B9层 发表时间: 04-04-28 21:06 |
![]() | 回复: 286 [unique] ![]() |
登录 |
这么简单的问题,有这么麻烦吗? 你刚开始的思路就不好,如果都这样作的话,效率就太低了。 int i,t[10],temp; for (i=0;i<10;i++) t[i]=i; for (i=0;i<10;i++) { index=rand()%10; temp=a[i]; a[i]=a[index]; a[index]=temp; } 这样a[0]~a[9]中任意的四个值都符合条件。如果感觉不相关性程度不够,可: int i,t[10],temp; for (i=0;i<10;i++) t[i]=i; for (j=0;j<7;j++) for (i=0;i<10;i++) { index=rand()%10; temp=a[i]; a[i]=a[index]; a[index]=temp; } } |
B10层 发表时间: 04-04-29 09:28 |
![]() | 回复: sniper167 [sniper167] ![]() |
登录 |
TO:286 你那个 j 从 0~9的循环有什么作用呀? |
B11层 发表时间: 04-04-29 10:51 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号