【问题标题】:Simple C random lottery number简单C随机彩票号码
【发布时间】:2019-03-27 01:34:07
【问题描述】:

我想以最简单的方式生成 5 个不同的数字并将它们放入一个数组中。我的思维方式有问题,请您更正我的代码吗?

void lottery(int *array){
    int i = 0;
    while(i != 5){
        bool good = true;
        int number = rand()%90+1;
        for(int j=0; j<5; j++){
            if(array[j] == number)
                good = false;
                break;

        }
        if(good){
            array[i] == number;
            i = i+1;
        }
    }
}

int main(){
    srand(time(0));
    int numbers[5];
    lottery(numbers);

    for(int i =0; i<5; i++){
        printf("%d, ",numbers[i]);
    }
    return 0;
}

【问题讨论】:

  • array[i] == number 还要考虑你的数组没有初始化。
  • j &lt; 5 更改为j &lt; i。你知道数组只包含i 值。
  • 以后,永远不要只给出“有问题”作为问题描述。显示错误的示例输出,或者准确地说出它有什么问题,或者显示正确的示例输出,或者两者兼而有之。通常,您还应该显示产生样本输出的样本输入。当涉及srand 时,您应该同时显示使用的种子(将其从time(0) 更改为常数,并尝试不同的常数,直到找到产生要显示的样本的常数)并显示每个rand 产生的值调用(因为不同的 C 实现有不同的rand 实现)。
  • == 不是赋值运算符。这不是你“思维方式”的问题,只是一个错字。
  • 你是否意识到 if(array[j] == number) good = false; break; 中的中断无条件地打破了 for 循环 - C 不是 Python,缩进对编译器没有任何意义,对阅读 C 的人来说意义重大。你需要大括号围绕作业和休息。

标签: c random numbers generate


【解决方案1】:

包括kingW3rici的发现并稍微清理一下:

// compiles without errors with:
// clang -O3 -g3 -Weverything -W -Wall -Wextra -Wpedantic -fsanitize=bounds  -std=c11  -o stacktest stacktest.c 
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>

void lottery(int *array);
void lottery(int *array){
    int i = 0;
    while(i != 5){
        bool good = true;
        int number = rand()%90+1;
        // limit is 'i' because you fill the array in order
        for(int j=0; j<i; j++){
            // Would always `break` without the curly brackets
            if(array[j] == number){
                good = false;
                break;
            }
        }
        if(good){
            // Use '=' instead of '=='
            array[i] = number;
            i = i+1;
        }
    }
}

int main(void){
    // time returns type 'type_t', needs casting to get rid of
    // warning
    srand( (unsigned int) time(0));
    // return of rand() is always >= 0, so 
    // initialize with a negative number
    int numbers[5] = {-1};
    int i;
    lottery(numbers);
    for(i =0; i<4; i++){
        printf("%d, ",numbers[i]);
    }
    printf("%d\n",numbers[i]);
    return 0;
}

缺少括号是另一个错误。

警告:time() 的分辨率很可能是一秒,所以不要按顺序运行太快,否则你会得到相同的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多