当我运行这个程序的时候,我想要一个0和1s的列表,但是我得到了一个0,1,和一堆正负随机数的列表。我做错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int randomInt(maxNum) {
return (rand() % maxNum - 1) + 1;
}
int main(void) {
srand(time(NULL));
int board[100];
int index = 1;
for (int i = 0; i < 20; i ++) {
board[randomInt(100)] = 1;
}
for (int i = 0; i < 100; i ++) {
printf("%i\n", board[index]);
index ++;
}
}发布于 2021-04-20 04:43:04
您没有初始化board,因此它在每个单元格中都有不确定的值,但是分配给1的值是20 (或更少)。使用零显式初始化它:
int board[100] = {0};以避免将堆栈上的随机垃圾作为初始值处理。我还建议打开编译器警告(它应该识别初始化失败,尽管伪随机部分初始化在本例中可能会欺骗它)。
发布于 2021-04-23 17:57:44
-运算符比%运算符具有更高的优先级,因此将在模块操作之前执行减法。因此,对randomInt()的调用返回范围为1.99的值,这是可以的。
在启用警告的情况下,通过编译器运行已发布的代码:
gcc -ggdb3 -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c "untitled2.c" -o "untitled2.o" 在以下方面的成果:
untitled2.c: In function ‘randomInt’:
untitled2.c:5:5: warning: type of ‘maxNum’ defaults to ‘int’ [-Wimplicit-int]
5 | int randomInt(maxNum) {
| ^~~~~~~~~
untitled2.c: In function ‘main’:
untitled2.c:10:9: warning: conversion from ‘time_t’ {aka ‘long int’} to ‘unsigned int’ may change value [-Wconversion]
10 | srand(time(NULL));
| ^~~~~~~~~~编译时,始终启用警告,然后修复这些警告。
正如其他人所评论的,将board[]初始化为一个已知的值,如0
您可以通过以下方式更正randomInt()的签名:
int randomInt( int maxNum) {您可以通过以下方式消除有关conversion to unsigned的警告:
srand( (unsigned) time(NULL));关于:
for (int i = 0; i < 100; i ++) {
printf("%i\n", board[index]);
index ++;
}这可以简化,这样它就不会通过以下方式引入另一个变量:
for ( index = 0; index < 100; index++ )
{
printf( "%i\n", board[index] );
}https://stackoverflow.com/questions/67172547
复制相似问题