如何用C语言产生不重复的0到9之间的随机数
答案:4 悬赏:80 手机版
解决时间 2021-03-27 14:24
- 提问者网友:贪了杯
- 2021-03-26 20:58
如何用C语言产生不重复的0到9之间的随机数
最佳答案
- 五星知识达人网友:几近狂妄
- 2021-03-26 21:37
刚调试了下,弄不明白的是,为什么SZ[10]明明不存在却永远是产生的r对应输出的数。。。
费解呀。但好像用9来说应该会更规范一些。
最后都沉底了。
。。。。又研究了20分钟,终于弄懂了。。。实际上应该是9更标准一些,虽然10不会溢出。。。rang()%(10-i)第一个从0-9里选,然后选过的消失。。。最后一个为9
第二次从0-8里选,选过的消失。。。最后2个为9,以后永远都选不上第8和第九。无论9出没出现过,以此类推。最终全部为九,其余消失。
如果为10的话,其实也影响不了,因为最后几个数永远都不会取到、
采纳了吧。。。。。。
额,其实最标准的应该把那个地方改成9-i,把没选的数字往前推,但是已经出现的过的就不必推了。。。
费解呀。但好像用9来说应该会更规范一些。
最后都沉底了。
。。。。又研究了20分钟,终于弄懂了。。。实际上应该是9更标准一些,虽然10不会溢出。。。rang()%(10-i)第一个从0-9里选,然后选过的消失。。。最后一个为9
第二次从0-8里选,选过的消失。。。最后2个为9,以后永远都选不上第8和第九。无论9出没出现过,以此类推。最终全部为九,其余消失。
如果为10的话,其实也影响不了,因为最后几个数永远都不会取到、
采纳了吧。。。。。。
额,其实最标准的应该把那个地方改成9-i,把没选的数字往前推,但是已经出现的过的就不必推了。。。
全部回答
- 1楼网友:長槍戰八方
- 2021-03-27 00:28
就是10,自己看吧!!!不会溢出的说!!!9+1=10,而数组长度是10,不会溢出的,至于你问的不重复,用srand产生种子不会重复吧!!!至少我用这个没重复过!!!
- 2楼网友:几近狂妄
- 2021-03-27 00:00
这个建议用经典的洗牌算法。
循环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楼网友:神鬼未生
- 2021-03-26 23:13
如果是j<10,sz[j+1]会有sz[10]这一元素;
同志,没看到吧
会溢出,地址都越界了
同志,没看到吧
会溢出,地址都越界了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯