Random 均匀随机数发生器
我想使用GSL的统一随机数生成器。在他们的网站上,他们包括以下示例代码: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
#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;
}