首页 > 解决方案 > 为什么我的随机数生成器不打印任何 1?

问题描述

我为我的一个项目制作了这个 randomNumberGenerator。它随机打印 1 到 9 之间的所有数字,但不打印数字 1。if 语句用于消除任何连续数字(123 或 555 fe)。我该怎么做才能确保它也能够打印 1。欢迎所有帮助!

处理我的文件的 fp 部分应该与问题无关。

编辑:我在 Windows 中工作

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

int main() {
    int n = 3000;
    int randomNumber;
    int lastNumber;

    FILE * fp;
    fp = fopen ("C:\\Users\\furtherDirectoryToFile", "w");

    srand(time(0));

    for (int i = 0; i < n; i++) {
        lastNumber = randomNumber;
        randomNumber = rand() % 10;
        if (randomNumber == lastNumber) {
            continue;
        } else {
            if (randomNumber == ((lastNumber + 1) || randomNumber == (lastNumber - 1))) {
                continue;
            }
        }
        printf("%d\n", randomNumber);
        fprintf (fp, "%d\n", randomNumber);
    }

    fclose (fp);
    return 0;
}

标签: c

解决方案


问题是,您的括号在 if 子句中设置错误。你需要:

if ((randomNumber == (lastNumber + 1)) || (randomNumber == (lastNumber - 1)))

相反,你有

(randomNumber == 
       ( (lastNumber + 1) || randomNumber == (lastNumber - 1)))

评估为

(randomNumber == 1)

这就是为什么你永远不会观察到 1。

进一步评论:

通常,如果您尝试禁止序列,它不会使您的随机数更安全;相反,如果有人知道这个算法,他可以对下一个数字做出假设,否则他无法做出假设。

来自评论:

正如 moooeeeep 评论的那样,您应该先初始化变量randomNumber,然后再使用它。

JoachimSauer 注意到,lastNumber只有在确实输出了数字时才应该设置它,否则您的算法可能会失败。

正如 SteveFriedl 评论的那样,如果您需要范围1-9而不是0-9,则使用randomNumber = rand() % 9 + 1;


推荐阅读