0Pricing
C++ Academy · 课时

分布

调整随机输出的形态

分布 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

分布的作用

分布会将引擎的原始位映射为具有所需形状和范围的值。调用它时,请将引擎作为参数传入。

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(1);
    std::uniform_int_distribution<int> dist(1, 100);
    std::cout << "value: " << dist(gen) << '\n';
    return 0;
}

均匀整数分布

std::uniform_int_distribution<int>(a, b) 会返回 [a, b] 范围内的整数,该范围包含端点,每个整数出现的可能性相同。

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(5);
    std::uniform_int_distribution<int> die(1, 6);
    for (int i = 0; i < 5; ++i) std::cout << die(gen) << ' ';
    std::cout << '\n';
    return 0;
}

均匀实数分布

std::uniform_real_distribution<double>(a, b) 会生成 [a, b) 范围内的浮点值,适合表示概率。

#include <iostream>
#include <random>
#include <iomanip>

int main() {
    std::mt19937 gen(3);
    std::uniform_real_distribution<double> dist(0.0, 1.0);
    std::cout << std::fixed << std::setprecision(3) << dist(gen) << '\n';
    return 0;
}

伯努利分布

std::bernoulli_distribution(p) 会以 p 的概率返回 true,用于模拟有偏硬币的投掷结果。

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(8);
    std::bernoulli_distribution coin(0.5);
    for (int i = 0; i < 5; ++i) std::cout << (coin(gen) ? 'H' : 'T');
    std::cout << '\n';
    return 0;
}

正态分布

std::normal_distribution<double>(mean, stddev) 会生成围绕均值聚集的钟形曲线。

#include <iostream>
#include <random>
#include <iomanip>

int main() {
    std::mt19937 gen(11);
    std::normal_distribution<double> dist(100.0, 15.0);
    std::cout << std::fixed << std::setprecision(1) << dist(gen) << '\n';
    return 0;
}

复用分布

重复调用分布的开销很低。创建一个分布,然后在循环中使用同一个引擎调用它。

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(20);
    std::uniform_int_distribution<int> d(1, 3);
    int counts[4] = {0};
    for (int i = 0; i < 12; ++i) counts[d(gen)]++;
    std::cout << counts[1] << ' ' << counts[2] << ' ' << counts[3] << '\n';
    return 0;
}

泊松分布

std::poisson_distribution<int>(mean)用于描述稀有事件的计数,例如每分钟的到达次数。

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(30);
    std::poisson_distribution<int> dist(4.0);
    for (int i = 0; i < 5; ++i) std::cout << dist(gen) << ' ';
    std::cout << '\n';
    return 0;
}

分布参数

您可以使用a()、b()、mean()或stddev()等访问器查询分布的参数。

#include <iostream>
#include <random>

int main() {
    std::uniform_int_distribution<int> d(10, 50);
    std::cout << "range: " << d.a() << " to " << d.b() << '\n';
    return 0;
}

重置分布状态

某些分布(例如正态分布)会缓存内部状态。reset()会清除这些状态,使下一个值仅取决于引擎。

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(40);
    std::normal_distribution<double> dist(0.0, 1.0);
    dist(gen);
    dist.reset();
    std::cout << "distribution state reset\n";
    return 0;
}

随机选择元素

要选择随机数组索引,请使用范围为0到size - 1的均匀整数分布。

#include <iostream>
#include <random>
#include <string>

int main() {
    std::string colors[] = {"red", "green", "blue"};
    std::mt19937 gen(50);
    std::uniform_int_distribution<int> pick(0, 2);
    std::cout << colors[pick(gen)] << '\n';
    return 0;
}

估算圆周率

分布为蒙特卡洛方法提供支持。在正方形中随机采样点可以估算圆周率。

#include <iostream>
#include <random>
#include <iomanip>

int main() {
    std::mt19937 gen(60);
    std::uniform_real_distribution<double> u(0.0, 1.0);
    int inside = 0, n = 10000;
    for (int i = 0; i < n; ++i) {
        double x = u(gen), y = u(gen);
        if (x * x + y * y <= 1.0) ++inside;
    }
    std::cout << std::fixed << std::setprecision(2) << 4.0 * inside / n << '\n';
    return 0;
}

快速检查

测试您对分布范围的理解。

回顾

您了解了分布:

  • 它们可以控制引擎的输出:uniform_int(包含两端)、uniform_real([a,b))、bernoulli、normal、poisson
  • 将引擎传给分布来调用它们,例如dist(gen),并在循环中重复使用
  • 它们可以用于选择元素和进行蒙特卡洛估算

接下来,您将正确地为引擎设置 seed。

常见问题解答

「分布」课时是免费的吗?

是的 — 「分布」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「分布」这节课中我会学到什么?

调整随机输出的形态 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「分布」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 随机引擎
  2. 分布
  3. 正确设定随机种子
  4. 实践示例
← 返回 C++ Academy