【问题标题】:Random Float Generator随机浮点发生器
【发布时间】:2015-06-08 14:18:28
【问题描述】:

我正在学习 c++,我正在尝试生成一个随机浮点数,但似乎遇到了一些困难。

我首先创建一个介于 -100 和 100 之间的随机 int() newRandom,然后我将这个 newRandom 转换为一个介于 -1.0 和 1.0 之间的随机浮点数 rand_X。唯一需要注意的是我不希望 rand_X 介于 -0.2 和 0.2 之间,换句话说,

-1.0

这是我的代码,

#include "stdafx.h"
#include <iostream>
#include <random>

int newRandom() {
    int newRandom = 0;
    std::random_device rd; // obtain a random number from hardware
    std::mt19937 eng(rd()); // seed the generator
    std::uniform_int_distribution<> distr(-100, 100); // define the range

    newRandom = distr(eng);

    return newRandom;
}

float newRandomX() {
    float rand_X = newRandom() / 100.0f;
    for (int n = 0; n > 0; n++) {
        if (rand_X < 0.0f && rand_X > -0.2f) {
            rand_X = newRandom() / 100.0f;
        }
        else if (rand_X > 0.0f && rand_X < 0.2f) {
            rand_X = newRandom() / 100.0f;
        }
        else {
            return rand_X;
        }
    }
}

int main()
{
    float dir_x = newRandomX();
    std::cout << dir_x;
}

我通常在 main() 的右括号处设置一个断点,这是我在控制台窗口中的输出,-nan(ind)

正如我所说,我正在学习语言,所以我可能正在做一些非常愚蠢的事情。非常感谢您的帮助!

【问题讨论】:

  • 这是什么for (int n = 0; n &gt; 0; n++)
  • 为什么不能直接使用uniform_real_distribution
  • for (int n = 0; n &gt; 0; n++) { 在第一次检查时使n &gt; 0 条件失败,因此循环从不运行。因此,您的函数不执行 return 语句,并且具有未定义的行为,在您的测试期间表面上恰好表现为 NaN。您可以使用for ( ; ; ) 循环,直到遇到returnbreakgotothrowexit 等......
  • 您应该注意的其他事项:1)您不应该每次都创建和播种新的生成器 - 使其成为静态的。 2) 你的main 函数应该返回一个值(通常是0)。 3)注意您的比较,以及是否应该是&gt;&gt;=,特别是如果您像提供的答案中那样反转它们。
  • 如何创建静态种子?我可以将它作为一个变量输入到 newRandow() 函数中吗?

标签: c++ random floating-point


【解决方案1】:

将您的 newRandomX() 更改为:

float newRandomX() {
    float rand_X = newRandom() / 100.0f;
    while(rand_X > -0.2f && rand_X < 0.2f) {
        rand_X = newRandom() / 100.0f;
    }
    return rand_X;
}

输出:

0.75
-0.93
-0.43
-0.82

【讨论】:

  • 谢谢!这正是我所需要的。我知道,如果我在重复某件事,会有更好的方法来做到这一点。
【解决方案2】:

您当前的代码只会生成两位小数(注意:四舍五入到浮点格式支持的最接近的值)。为了获得更好的分布(即更多位数),您应该将整数范围扩大到更大,然后除以大于 100.0f 的数字。

此外,不需要 while 循环。我会推荐一个 if 语句。

假设您的 newRandom 在 [-80:80] 而不是 [-100:100] 范围内生成一个整数,那么您可以执行以下操作:

float newRandomX() {
    float rand_X = newRandom() / 100.0f;
    if (rand_X < 0) {
        rand_X = rand_x - 0.2;
    } else {
        rand_X = rand_X + 0.2;
    }
    return rand_X;
}

如上所述,我还建议使用更大的整数范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 2011-06-28
    • 2011-07-14
    • 2021-11-12
    相关资源
    最近更新 更多