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

2024-11-08 13:56:11
推荐回答(4个)
回答1:

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

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

最后都沉底了。

 

 

 

 

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

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

 

 

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

 

 

采纳了吧。。。。。。

 

 

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

回答2:

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

循环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].

 

回答3:

就是10,自己看吧!!!不会溢出的说!!!9+1=10,而数组长度是10,不会溢出的,至于你问的不重复,用srand产生种子不会重复吧!!!至少我用这个没重复过!!!

回答4:

如果是j<10,sz[j+1]会有sz[10]这一元素;
同志,没看到吧

会溢出,地址都越界了