【问题标题】:Random function always returns 1随机函数总是返回 1
【发布时间】:2021-06-05 22:55:21
【问题描述】:

我的随机函数总是返回一个“1”而不是...任何东西
它应该返回“0”或“1”

int rnd() {
    unsigned int num0 = rand();
    if(num0 < 32767.5) {return 0;}
    if(num0 > 32767.5) {return 1;}
}

int chk;
bool _True = true;

int main(void) {
    while(_True) {
        chk = rnd();
        printf("%i\n", chk);
        //if(chk == 1) {printf("%i\n", chk); _True = false;}
        //if(chk == 0) {printf("%i\n", chk); _True = false;}
    }
}

【问题讨论】:

  • 你的代码有很多错误,但是当我运行它时,我总是从rnd() 函数中得到0 的值。那是因为RAND_MAX 在我的系统上被定义为 32767。但是,为什么要将 unsigned int 与浮点常量进行比较?
  • 好吧,你从来没有播种过你的rng。其次,通过仅在 not 1 时打印来确定“始终为 1”是否是推定的可能会更容易。最后,您的 rand() 的域具有高度偏见性。如果您正在寻找一个随机的“位”,那么只需return rand() &amp; 1;(或rand() % 2 也可以)。无论告诉您如何进行浮点比较,都没有给您带来太多好处。
  • _True 前导 _ 后跟大写字母的标识符保留。不要在你的代码中使用它们。
  • 在许多系统上,RAND_MAX 比 32767 大很多;我的是 2147483647。所以你的函数偶尔会返回零,但概率只有大约 1/65536,如果你只是用眼睛看,你可能只会看到 1。

标签: c gcc random


【解决方案1】:

首先,rand() 给出一个基于种子的伪随机数。如果在 rand() 之前不调用 srand(),那么每次运行程序都会得到相同的随机数序列。

其次,rand()函数返回一个0到RAND_MAX范围内的伪随机数。

RAND_MAX 是一个常量,其默认值可能因实现而异,但保证至少为 32767。

您似乎假设 RAND_MAX 是 32767.5 的两倍?

我建议先调用 srand(),然后测试 RAND_MAX / 2,或者将值设置为 rand() % 2。

(您可以通过打印 rand() 返回的内容和/或查看 rand() 的文档来确定。)

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2012-07-28
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多