c - 为什么我的随机数生成器不打印任何 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;
}
解决方案
问题是,您的括号在 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;
推荐阅读
- .net-core - 使用 autofac 和 Mediatr 注册组件
- reactjs - socket io on() 函数客户端无法获取 redux 的最后更新状态
- r - 使用累积识别 R 中的连续重复项
- javascript - 如何将一种泛型类型的结构复制到 TypeScript 中的另一种泛型?
- bash - 涉及环境路径时的命令替换
- python - 如何在显示文本和显示“*”之间进行 tkinter 条目切换
- html - 如何使用网页的全高
- html - 用于抓取 WSJ 和 Yahoo Finance 的 Google App 脚本
- php - base64_encode - 主机服务器升级后本地与主机上的结果不同
- sql - 带部门的案例陈述