当我运行这个程序时,我想要一个 0 和 1 的列表,但我得到的是一个 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 ++;
}
}
答案 0 :(得分:4)
您没有初始化 board
,因此它在每个单元格中都有不确定的值,但您分配给 1
的 20 个(或更少)。用零显式初始化它:
int board[100] = {0};
避免将堆栈上的随机垃圾视为初始值。我还建议打开编译器警告(它应该识别初始化失败,尽管在这种情况下伪随机部分初始化可能会欺骗它)。
答案 1 :(得分:0)
每C Operator Precedence
-
运算符的优先级高于 %
运算符,因此减法将在模运算之前执行。因此,对 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] );
}