c - C 中具有麦克斯韦分布的随机数

标签 c random distribution numerical-methods

我需要一个服从麦克斯韦分布的 10000 随机数。 对于正态分布,我知道我必须使用 Box-Muller 变换,但我的问题是为什么

 normal_distribution

默认定义为变量(或我不知道的任何东西)? “normal_distribution”是一个给出正态分布数字的函数吗?如果是,这可能适用于麦克斯韦分布吗?如果没有,我该怎么办? 事实上,我想学习如何在 C 中使用麦克斯韦分布创建随机数。 感谢您提供任何提示。

最佳答案

您最好使用 GNU Scientific Library .它是用纯 C 语言编写和测试的合理计算库。Maxwell distribution基本上是三个正态分布的分量的平方和加在一起。

一些未经测试的代码:

#include <math.h>
#include <stdio.h>
#include <gsl/gsl_rng.h>

double sample_maxwell(gsl_rng* r, double sigma) {
    double vx = gsl_ran_gaussian_ziggurat(r, sigma);
    double vy = gsl_ran_gaussian_ziggurat(r, sigma);
    double vz = gsl_ran_gaussian_ziggurat(r, sigma);

    return sqrt(vx*vx + vy*vy + vz*vz);
}

int main() {
    gsl_rng_env_setup();

    const gsl_rng_type* T = gsl_rng_default;
    gsl_rng*            r = gsl_rng_alloc(T);

    printf ("generator type: %s\n", gsl_rng_name (r));
    printf ("seed = %lu\n", gsl_rng_default_seed);
    printf ("first value = %lu\n", gsl_rng_get (r));        

    double Temperature = 300.0;   // K
    double kBoltzmann  = 8.62e−5; // eV/K
    double mass        = 1.0e+9;  // 1GeV/c^2, roughly atomic hydrogen

    double sigma = sqrt(kBoltzmann*Temperature/mass);

    for(int k = 0; k != 100; ++k) {
        double v = sample_maxwell(r, sigma);
        printf("%e", v);
    }

    gsl_rng_free(r);        

    return 0;
}

麦克斯韦分布来自统计物理学,其中气体分子具有速度 v 和玻尔兹曼指数得出速度分布

f(v)d3v = C exp(- m v2/2 kBT) d3v

要从中获得麦克斯韦分布,您只需在 v 坐标上表达球面分布,幂项基本上来自雅可比矩阵。但是很容易看出它相当于每个分量的三个高斯分布的乘积。我将向您介绍以下页面 https://farside.ph.utexas.edu/teaching/sm1/Thermalhtml/node87.html尤其是公式 7.217。这里还有一个友情讨论链接https://scicomp.stackexchange.com/questions/19969/how-do-i-generate-maxwell-boltzmann-variates-using-a-uniform-distribution-random .

Maxwell 采样的替代方法有:

  1. 认识到,高斯三平方和可以表示为 Chi2 distribution具有 3 个自由度并通过 gsl_ran_chisq(r, 3) 采样 v2

  2. 样本 v2 作为 Gamma distribution 的结果通过 gsl_ran_gamma_knuth(r, 3./2., 1.0)

而且维基百科也总是有所有这些内容:https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution

关于c - C 中具有麦克斯韦分布的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47251332/

相关文章:

python - 我可以创建本地 numpy 随机种子吗?

java - 如何在 JavaFX FXML 中公平分配 VBox 中的节点

r - 绘制分布的尾部

c - 函数返回错误值

c - 从我们按下键盘上的一个键到它出现在你的word文档中会发生什么

java - 非常基本的 GObject/GOval For 循环

java - 两种洗牌方法中哪种效果更好?

iphone - 苹果是否改变了他们的应用程序存档方法?

Objective-C 变量...指向自身?

c - 从 void * 缓冲区读取 double