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<
_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);
}
那个sz【10】的确是越界了,我也不知道的。不过我想应该把J<10改成j<9吧,这样你应该懂了吧。就是输出一个数的时候,就把这个数丢掉了,让后面的数一次补充前面的位置。这样就不会产生重复的数了。还有哪不懂的么、?