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,把没选的数字往前推,但是已经出现的过的就不必推了。。。
这个建议用经典的洗牌算法。
循环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].