C语言,10次生成(1~10不重复)10个随机数 30
#include<stdlib.h>#include<stdio.h>#include<time.h>intmain(void){inti;intr;intsz[10]=...
#include <stdlib.h>
#include <stdio.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);
cout<<r<<endl;
printf("%d\n",sz[r]);
for(int j=r;j<10;j++)
{
sz[j]=sz[j+1]; //这里不明白,当j=9时,sz[j+1]已越界,请问出现了什么情况
}
}
return 0;
}
各位大哥,这是我在网上看到的程序,不过看不太懂,请问那个
sz[10]越界后发生了什么情况,这个程序是怎么实现题目要求的条件的
不追求快,不要黏贴,求详解
这个程序我弄懂了,谢谢大家,越界数组sz[10]其实是r,这是编译器分配地址是紧挨着的,分配地址从下到上,从右到左
i=0;时
r=rand()%(10-i);
产生的是的是0-9的随机数,
for(int j=r;j<10;j++)
{
sz[j]=sz[j+1]; //这里越界数组sz[10等于r并把值给sz[9]]
}
之后就不可能再有产生的随机数放在sz[9],因为r=rand()%(10-i);
如果一开始没有产生9,以后就没有可能产生9了,但是由于sz[10],里面已经有了9,所以如果没有产生意识不怕的,向要详细解释可以HI我 展开
#include <stdio.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);
cout<<r<<endl;
printf("%d\n",sz[r]);
for(int j=r;j<10;j++)
{
sz[j]=sz[j+1]; //这里不明白,当j=9时,sz[j+1]已越界,请问出现了什么情况
}
}
return 0;
}
各位大哥,这是我在网上看到的程序,不过看不太懂,请问那个
sz[10]越界后发生了什么情况,这个程序是怎么实现题目要求的条件的
不追求快,不要黏贴,求详解
这个程序我弄懂了,谢谢大家,越界数组sz[10]其实是r,这是编译器分配地址是紧挨着的,分配地址从下到上,从右到左
i=0;时
r=rand()%(10-i);
产生的是的是0-9的随机数,
for(int j=r;j<10;j++)
{
sz[j]=sz[j+1]; //这里越界数组sz[10等于r并把值给sz[9]]
}
之后就不可能再有产生的随机数放在sz[9],因为r=rand()%(10-i);
如果一开始没有产生9,以后就没有可能产生9了,但是由于sz[10],里面已经有了9,所以如果没有产生意识不怕的,向要详细解释可以HI我 展开
展开全部
sz[j]=sz[j+1];
数组下标是从 0 开始的,所以J=9,j+1=10,而是S[10]就越界了。
不知道这个代码是哪里来的
我运行了一下你贴出来的代码
觉得有很多不合逻辑的地方。
首先sz这个数组没有任何实际的意义,姑且推断它是用来存储结果的吧。
再说sz[10],如果你debug看一下。实际上数组的取值和指针极为相似,是从sz的值开始,向后偏移[下标]个对象的距离。所以这个程序里它把后面那个内存里的数据给读出来,并且赋值了。
int main(void)
{
int i;
int r;
int sz[10];
srand(time(NULL));
printf("Ten random numbers from 0 to 9\n\n");
for(i=0; i<10; i++)
{
r=rand()%(10-i);
sz[i]=r;
cout<<sz[i]<<endl;
}
_getch();
return 0;
}
对原来的程序,参考 li131179 的理解,输出一个数时,就把这个数丢掉,而这个过程中r=rand()%(10-i);,当i=9时,也就是最后一个循环,r的结果必然为零,而之前也有出现0的可能,直观上就不能避免0的重复。而且循环只执行了10次,也就是如果重复获得了随机数,那么不会有第11次的机会生成另一个的。
数组下标是从 0 开始的,所以J=9,j+1=10,而是S[10]就越界了。
不知道这个代码是哪里来的
我运行了一下你贴出来的代码
觉得有很多不合逻辑的地方。
首先sz这个数组没有任何实际的意义,姑且推断它是用来存储结果的吧。
再说sz[10],如果你debug看一下。实际上数组的取值和指针极为相似,是从sz的值开始,向后偏移[下标]个对象的距离。所以这个程序里它把后面那个内存里的数据给读出来,并且赋值了。
int main(void)
{
int i;
int r;
int sz[10];
srand(time(NULL));
printf("Ten random numbers from 0 to 9\n\n");
for(i=0; i<10; i++)
{
r=rand()%(10-i);
sz[i]=r;
cout<<sz[i]<<endl;
}
_getch();
return 0;
}
对原来的程序,参考 li131179 的理解,输出一个数时,就把这个数丢掉,而这个过程中r=rand()%(10-i);,当i=9时,也就是最后一个循环,r的结果必然为零,而之前也有出现0的可能,直观上就不能避免0的重复。而且循环只执行了10次,也就是如果重复获得了随机数,那么不会有第11次的机会生成另一个的。
展开全部
C++不会自动检查数组越界,也就是说如果数组越界,程序编译时不会报错,从而在执行时产生非法操作或者得不到正确的结果甚至导致程序崩溃
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int table[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
void swap(int* a, int* b) { // 交换两个元素
int c = *a;
*a = *b;
*b = c;
}
void rand_n(int len, n) { // 打乱table中各个元素之间的顺序
for (int i = 0; i < len; i++) {
swap(&table[i], &table[rand() / len]);
}
for (int i = 0; i < n; i++) { // 输出前n个元素
printf("%d\n", table[i]);
}
}
int main() {
rand_n(sizeof(table)/sizeof(int), 4);
}
void swap(int* a, int* b) { // 交换两个元素
int c = *a;
*a = *b;
*b = c;
}
void rand_n(int len, n) { // 打乱table中各个元素之间的顺序
for (int i = 0; i < len; i++) {
swap(&table[i], &table[rand() / len]);
}
for (int i = 0; i < n; i++) { // 输出前n个元素
printf("%d\n", table[i]);
}
}
int main() {
rand_n(sizeof(table)/sizeof(int), 4);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那个sz【10】的确是越界了,我也不知道的。不过我想应该把J<10改成j<9吧,这样你应该懂了吧。就是输出一个数的时候,就把这个数丢掉了,让后面的数一次补充前面的位置。这样就不会产生重复的数了。还有哪不懂的么、?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询