【问题标题】:how to generate true or false values using normal distribution in c++如何在 C++ 中使用正态分布生成真值或假值
【发布时间】:2012-03-15 20:56:51
【问题描述】:

我想在不使用提升和“奇怪”的东西的情况下做到这一点,我想在人生游戏中随机填满一个棋盘。

【问题讨论】:

  • 正态分布是连续的,所以它不会产生真/假值。如果您需要一些随机值,您可能只想使用 rand 并选择最后一位。不是最好的随机值,但我认为已经足够了。
  • 离散化给定的正态分布以适应网格的单元格。
  • 正态分布适用于身高、体重(连续)。您需要考虑 Bernoulli_distribution (en.wikipedia.org/wiki/Bernoulli_distribution)

标签: c++ boolean distribution


【解决方案1】:

Boost 并不奇怪,它被视为标准并不遥远。 (事实上​​,其中大部分是新标准——c++11 中新库特性的支柱)。所以我不会排除它。

http://www.boost.org/doc/libs/1_49_0/libs/math/doc/sf_and_dist/html/math_toolkit/dist/dist_ref/dists/normal_dist.html

在这样的系统之外,您必须自己实现它,这更像是一个数学问题。

【讨论】:

  • +1 用于推荐 boost,它是一个很棒的库,虽然 OP 不想使用它。
  • 我想用它,但是有一天我尝试安装它并不起作用,并且没有找到好的安装和使用文档
  • @freinn 非常值得认真工作。如果您有现代编译器,请参阅我的其他答案。
【解决方案2】:

只需使用stlibrand()

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

bool randomBool() {
  return rand() % 2 == 1;
}

int main ()
{
 /* initialize random seed: */
  srand ( time(NULL) );

/* fill up your game board here */

}

请注意,它不会产生完全一致的结果。为了实现这一点,您可能必须自己实现一些东西。出于非加密目的,无论如何你可能没问题。

【讨论】:

  • 好的我知道了,我会用它xDD
  • 当 OP 的问题是针对“正常”分布点时,“统一”如何成为可接受的答案?
  • 我的老师说这个词“统一”,但谷歌搜索我没有找到达到这个的功能
  • Modulo 是一个相当重的运算符。如果所有 rand 只生成正数,那么 AND 运算符应该更有效。 rand()&1
  • Modulo 2 应该被任何现代编译器的位移位所取代。
【解决方案3】:

C++11 并使用以下方法进行操作

#include <random>
#include <vector>

int main()
{
    std::mt19937 gen;
    std::bernoulli_distribution     dist;

    std::vector<bool> bv;
    bv.reserve(100);

    for(unsigned i=0; i!=100; ++i)
            bv.push_back( dist(gen));

    return 0;
}

另外,对于布尔值,我真的不明白均匀分布和正态分布之间的区别。

请参阅此处了解 C++ 随机数。 http://en.cppreference.com/w/cpp/numeric/random

【讨论】:

  • 我们不应该在创建后播种生成器吗? std::mt19937 generator; generator.seed(time(NULL)); std::bernoulli_distribution distribution; for (int i = 0; i &lt; 10; ++i) { bool random = distribution(generator); std::cout &lt;&lt; random &lt;&lt; std::endl; }
  • 取决于用户是否是确定性序列。如果他们不这样做,那么使用std::random_devicetime(NULL) 干净得多
【解决方案4】:

我想你会想要使用 C++11 的统一分布。你需要#include &lt;random&gt;

std::default_random_engine defaultRandomEngine(std::random_device{}());
std::uniform_int_distribution<> uniformDistribution(0, 1);
for(int i = 0; i < 100; ++i)
{
    std::cout << static_cast<bool>(uniformDistribution(defaultRandomEngine)) << std::endl;
}

【讨论】:

  • 为什么不能只使用== 1
猜你喜欢
  • 2019-08-20
  • 1970-01-01
  • 2021-12-22
  • 2020-01-05
  • 2016-09-13
  • 2011-04-23
  • 1970-01-01
  • 2021-05-29
  • 2020-11-25
相关资源
最近更新 更多