如何用C语言产生不重复的0到9之间的随机数

http://zhidao.baidu.com/question/80697080.html?from=commentSubmit#answers270054495
上面的会重复 ,用我这个

#include <stdlib.h> //标准工具库,要用到其中的rand()
#include <stdio.h>
#include<conio.h>
#include <time.h> //时间库,要用到里面的时间来做随机数的种子

int main(void)
{
int i;
int r;
int sz[10]={0,1,2,3,4,5,6,7,8,9};
srand(time(NULL));

printf("Ten random numbers from 0 to 9\n\n");
for(i=0; i<10; i++)
{
r=rand()%(10-i);

printf("%d\n",sz[r]);

for(int j=r;j<10;j++)
sz[j]=sz[j+1];

}
getch();
return 0;
}
关于for(int j=r;j<10;j++)
sz[j]=sz[j+1];这个,我想问一问,为什么要j<10; j<9 不是更规范吗,,《10 会不会发生溢出,,请问一下,
谢谢

刚调试了下,弄不明白的是,为什么SZ[10]明明不存在却永远是产生的r对应输出的数。。。

费解呀。但好像用9来说应该会更规范一些。

最后都沉底了。

 

 

 

 

。。。。又研究了20分钟,终于弄懂了。。。实际上应该是9更标准一些,虽然10不会溢出。。。rang()%(10-i)第一个从0-9里选,然后选过的消失。。。最后一个为9

第二次从0-8里选,选过的消失。。。最后2个为9,以后永远都选不上第8和第九。无论9出没出现过,以此类推。最终全部为九,其余消失。

 

 

如果为10的话,其实也影响不了,因为最后几个数永远都不会取到、

 

 

采纳了吧。。。。。。

 

 

额,其实最标准的应该把那个地方改成9-i,把没选的数字往前推,但是已经出现的过的就不必推了。。。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-28

这个建议用经典的洗牌算法。

循环100次(或者更多次),随机的将两个牌交换位置

程序如下:

 

void main(){  

 int sz[10]={0,1,2,3,4,5,6,7,8,9};

 int i,j, k, swap;


 for(k = 0;k<100;k++)

 {

      i = rand()%10;  j = rand()%10;

      if(i!=j)  {   swap = sz[i];   sz[i]=sz[j];   sz[j]=swap;  }

 }


 for(i = 0;i<10;i++)

 {

      printf("%d ",sz[i]);

 }

}

 

另外,如果按照你的算法的话,应该是改为9,你的担心是正确的,这儿确实发生了越界。

不信你到最后把sz全部打印出来,就会发现里面的数字全部是垃圾数据了。(也就是越界访问了sz[10].

 

第2个回答  2013-04-28
就是10,自己看吧!!!不会溢出的说!!!9+1=10,而数组长度是10,不会溢出的,至于你问的不重复,用srand产生种子不会重复吧!!!至少我用这个没重复过!!!
第3个回答  2013-04-29
如果是j<10,sz[j+1]会有sz[10]这一元素;
同志,没看到吧

会溢出,地址都越界了
相似回答