Random 均匀随机数发生器

Random 均匀随机数发生器,random,Random,我想使用GSL的统一随机数生成器。在他们的网站上,他们包括以下示例代码: #include <stdio.h> #include <gsl/gsl_rng.h> int main (void) { const gsl_rng_type * T; gsl_rng * r; int i, n = 10; gsl_rng_env_setup(); T = gsl_rng_default; r = gsl_rng_alloc

我想使用GSL的统一随机数生成器。在他们的网站上,他们包括以下示例代码:

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

 int
 main (void)
 {
   const gsl_rng_type * T;
   gsl_rng * r;

   int i, n = 10;

   gsl_rng_env_setup();

   T = gsl_rng_default;
   r = gsl_rng_alloc (T);

   for (i = 0; i < n; i++) 
     {
       double u = gsl_rng_uniform (r);
       printf ("%.5f\n", u);
     }

   gsl_rng_free (r);

   return 0;
 }
但我不明白如何实现这一点。关于我可以对上述代码进行哪些修改以合并种子,您有什么想法吗?

请阅读以了解该
gsl\u rng\u env\u setup()
函数正在做什么。它从环境变量中获取生成器类型和种子


然后查看-如果不想从环境变量中获取种子,可以使用
gsl\u rng\u set()
设置种子。

中可以看到此问题的完整答案和示例代码

为了完整起见,我在这里放了一个函数的代码副本来创建一个种子。这是罗伯特·G·布朗写的:


问题是没有生成新的种子。如果你只想要一个返回一个该死的随机数的函数,而不关心它是如何生成的,那么试试这个。假设您已经安装了GSL

#include <iostream>
#include <gsl/gsl_math.h>
#include <gsl/gsl_rng.h>
#include <sys/time.h>

float keithRandom() {
    // Random number function based on the GNU Scientific Library
    // Returns a random float between 0 and 1, exclusive; e.g., (0,1)
    const gsl_rng_type * T;
    gsl_rng * r;
    gsl_rng_env_setup();
    struct timeval tv; // Seed generation based on time
    gettimeofday(&tv,0);
    unsigned long mySeed = tv.tv_sec + tv.tv_usec;
    T = gsl_rng_default; // Generator setup
    r = gsl_rng_alloc (T);
    gsl_rng_set(r, mySeed);
    double u = gsl_rng_uniform(r); // Generate it!
    gsl_rng_free (r);
    return (float)u;
}
#包括
#包括
#包括
#包括
浮动keithRandom(){
//基于GNU科学库的随机数函数
//返回介于0和1之间的随机浮点,互斥;例如,(0,1)
const gsl_rng_类型*T;
gsl_rng*r;
gsl_rng_env_setup();
struct timeval tv;//基于时间的种子生成
gettimeofday(&tv,0);
未签名的long mySeed=tv.tv_sec+tv.tv_usec;
T=gsl\u rng\u default;//发电机设置
r=gsl_rng_alloc(T);
gsl_rng_集(r,mySeed);
double u=gsl\u rng\u uniform(r);//生成它!
gsl_rng_free(r);
返回(浮动)u;
}

这似乎并没有回答Jamia的问题,即如何将种子合并到GSL随机数生成器中,而不是如何生成一个用作种子的数字。我阅读Jamia问题的方式,我觉得这是在问如何生成一个种子,每次都给出一组不同的随机数。我发现了这个问题(在被问了1.5年之后),因为我有这个问题(我对这个问题的解释!)。到目前为止,Jamaia不再需要答案,但是其他和我有同样问题的读者会被带到这个页面,他们想要一个答案。
#include <stdio.h>
#include <sys/time.h>

unsigned long int random_seed()
{

 unsigned int seed;
 struct timeval tv;
 FILE *devrandom;

 if ((devrandom = fopen("/dev/random","r")) == NULL) {
   gettimeofday(&tv,0);
   seed = tv.tv_sec + tv.tv_usec;
 } else {
   fread(&seed,sizeof(seed),1,devrandom);
   fclose(devrandom);
 }

 return(seed);

}
#include <stdio.h>
#include <sys/time.h>

unsigned long int random_seed()
{
 struct timeval tv;
 gettimeofday(&tv,0);
 return (tv.tv_sec + tv.tv_usec);
}
#include <iostream>
#include <gsl/gsl_math.h>
#include <gsl/gsl_rng.h>
#include <sys/time.h>

float keithRandom() {
    // Random number function based on the GNU Scientific Library
    // Returns a random float between 0 and 1, exclusive; e.g., (0,1)
    const gsl_rng_type * T;
    gsl_rng * r;
    gsl_rng_env_setup();
    struct timeval tv; // Seed generation based on time
    gettimeofday(&tv,0);
    unsigned long mySeed = tv.tv_sec + tv.tv_usec;
    T = gsl_rng_default; // Generator setup
    r = gsl_rng_alloc (T);
    gsl_rng_set(r, mySeed);
    double u = gsl_rng_uniform(r); // Generate it!
    gsl_rng_free (r);
    return (float)u;
}