【问题标题】:Random number generator between -1 and 1 in C++ [duplicate]C ++中-1和1之间的随机数生成器[重复]
【发布时间】:2015-10-28 11:14:52
【问题描述】:

标题几乎说明了一切。我在网上查过,但我找不到这种语言的任何东西。我看过以下内容: ((double) rand() / (RAND_MAX)) 没有运气。我也想避免使用外部库。

当我计算 X,Y 坐标时,该值应该是一个浮点数。

【问题讨论】:

  • 你在使用 C++11 吗?
  • 你找不到像this这样的东西吗?还是this?

标签: c++ random


【解决方案1】:

如果您使用的是 C++11,则可以为此使用随机标头。你需要创建一个生成器,然后在这个生成器上定义一个分布,然后你可以使用生成器和分布来获得你的结果。您需要包含随机数

#include <random>

然后定义生成器和你的分布

std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(-1,1); //doubles from -1 to 1

那么你可以像这样得到随机数

double random_number = distribution(generator);

如果您需要更多信息,请点击此处http://www.cplusplus.com/reference/random/

【讨论】:

    【解决方案2】:

    也许是((double) rand() / (RAND_MAX)) * 2 - 1。

    【讨论】:

    • 如果你在 2011 年之前写过这篇文章,可能会被投票赞成...
    【解决方案3】:

    不要简单地使用rand(),因为它不是随机的,只是伪随机的!

    unsigned int rand_interval(unsigned int min, unsigned int max)
    {
        int r;
        const unsigned int range = 1 + max - min;
        const unsigned int buckets = RAND_MAX / range;
        const unsigned int limit = buckets * range;
    
        /* Create equal size buckets all in a row, then fire randomly towards
         * the buckets until you land in one of them. All buckets are equally
         * likely. If you land off the end of the line of buckets, try again. */
        do
        {
            r = rand();
        } while (r >= limit);
    
        return min + (r / buckets);
    }
    

    这是一个功能齐全的代码。 (不要忘记在 main 中使用 srand() 播种 rand!

    注意>我不能把它归功于它,因为我在网上的某个地方也看到了它,而且我自己使用了一段时间。

    【讨论】:

    • 这不是伪随机到底是怎么回事?我在这里没有看到硬件设备。
    • 正确。我说错了。想说它的 more 随机而不是简单地做 number = rand() 或类似的东西。
    • @user3735245 只是一个建议:除非你是数学博士,否则不要乱搞概率和/或随机性。
    • 是的,你认为它更随机,看起来它可以/应该/可能更随机,但除非你花了很多努力寻找模式和/或非常努力地思考,你可能错了。随机数生成因疏忽大意的 Dunning-Krugering 而臭名昭著。
    猜你喜欢
    • 2013-01-02
    • 2010-12-06
    • 2014-04-02
    • 1970-01-01
    • 2011-08-19
    • 2013-12-21
    • 2012-11-03
    • 1970-01-01
    相关资源
    最近更新 更多