论坛: 编程破解 标题: 产生4个不重复的0~9的随机数的程序 复制本贴地址    
作者: 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号