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

http://zhidao.baidu.com/question/80697080.html?from=commentSubmit#answers270054495上面的... 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 会不会发生溢出,,请问一下,
谢谢
展开
 我来答
我爱酸牛奶7
2013-04-28 · TA获得超过173个赞
知道答主
回答量:107
采纳率:0%
帮助的人:77.5万
展开全部

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

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

最后都沉底了。

 

 

 

 

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

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

 

 

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

 

 

采纳了吧。。。。。。

 

 

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

KummerWu
2013-04-28 · TA获得超过694个赞
知道小有建树答主
回答量:378
采纳率:0%
帮助的人:418万
展开全部

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

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

 

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-04-28
展开全部
就是10,自己看吧!!!不会溢出的说!!!9+1=10,而数组长度是10,不会溢出的,至于你问的不重复,用srand产生种子不会重复吧!!!至少我用这个没重复过!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-04-29
展开全部
如果是j<10,sz[j+1]会有sz[10]这一元素;
同志,没看到吧

会溢出,地址都越界了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式