这个问题是关于这个问题的评论
推荐的方法来初始化srand?第一条评论说srand()
应该只在应用程序中调用ONCE.为什么会这样?
我需要一种'好'的方法来初始化C++中的伪随机数生成器.我发现一篇文章指出:
为了生成类似随机数的数字,srand通常被初始化为一些独特的值,就像那些与执行时间相关的值.例如,函数时间返回的值(在标题ctime中声明)每秒都不同,这对于大多数随机需求来说足够独特.
Unixtime对我的应用来说并不是很有特色.有什么更好的方法来初始化它?奖励点是否可移植,但代码主要在Linux主机上运行.
我正在考虑做一些pid/unixtime数学来得到一个int,或者可能从中读取数据/dev/urandom
.
谢谢!
编辑
是的,我实际上是每秒多次启动我的应用程序而且我遇到了碰撞.
背景:我使用rand()
,std::rand()
,std::random_shuffle()
和我的科学计算代码等功能.为了能够重现我的结果,我总是明确指定随机种子,并通过它设置srand()
.直到最近,当我发现libxml2也会srand()
在第一次使用时懒得打电话- 这是在我早期的srand()
电话之后.
我填写了一个关于它的srand()
调用的错误报告到libxml2,但我得到了答案:
首先初始化libxml2.这是一个完全合法的电话会议.您不应该期望没有其他人调用
srand()
,并且手册页无处声明srand()
应该避免使用多个时间
这实际上是我现在的问题.如果一般政策是每个lib可以/应该/将要调用srand()
,并且我可以/也可以在这里和那里调用它,我真的不知道它是如何有用的.或者如何rand()
有用呢?
这就是为什么我认为,一般(不成文)策略是没有lib应该调用srand()
,应用程序应该在开始时只调用它一次.(不考虑多线程.我想在这种情况下,你无论如何应该使用不同的东西.)
我也尝试研究其他库实际调用的一些srand()
,但我没有发现任何.有吗?
我目前的解决方法是这个丑陋的代码:
{
// On the first call to xmlDictCreate,
// libxml2 will initialize some internal randomize system,
// which calls srand(time(NULL)).
// So, do that first call here now, so that we can use our
// own random seed.
xmlDictPtr p = xmlDictCreate(); …
Run Code Online (Sandbox Code Playgroud) 据我所知,如果不更改种子数,rand()函数会生成相同的数字.这就是srand()的用武之地.时间总是在变化所以我知道你应该将time(null)参数传递给srand.我的问题是从教程网站下面的代码.
int main()
{
int i, n=5;
time_t t;
/* Intializes random number generator */
srand((unsigned) time(&t));
/* Print 5 random numbers from 0 to 50 */
for( i = 0 ; i < n ; i++ ) {
printf("%d\n", rand() % 50);
}
return(0);
}
Run Code Online (Sandbox Code Playgroud)
我看不到srand的链接
((unsigned) time(&t));
Run Code Online (Sandbox Code Playgroud)
和兰特.
printf("%d\n", rand() % 50);
Run Code Online (Sandbox Code Playgroud)
兰德和斯特兰德之间的联系在哪里?我的意思或期望是我假设rand()将从srand()获取一些参数,因此它知道每次生成不同的数字.我假设它看起来像rand(srand(time(null));
这就像在不使用它的情况下初始化变量一样.srand正在初始化,但我没有看到它被使用.
rand会生成不同的数字,因为在rand之前首先调用srand吗?
我刚刚发现了将srand(1)
C(++)的PRNG重置为任何调用之前的状态srand
(如参考文献中所定义)的困难方法.然而,种子0似乎做同样的事情,或者在任何调用之前的状态srand
似乎都使用种子0.这两个调用之间有什么区别或者他们做同样事情的原因是什么?
例如这段代码(在Ideone上执行)
#include <stdio.h>
#include <stdlib.h>
int main() {
for (int seed = 0; seed < 4; seed++ ) {
printf( "Seed %d:", seed);
srand( seed );
for(int i = 0; i < 5; i++ )
printf( " %10d", rand() );
printf( "\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
回报
Seed 0: 1804289383 846930886 1681692777 1714636915 1957747793
Seed 1: 1804289383 846930886 1681692777 1714636915 1957747793
Seed 2: 1505335290 1738766719 190686788 260874575 747983061
Seed …
Run Code Online (Sandbox Code Playgroud) 每当我尝试使用srand
功能时,我都会收到此警告
"implicit declaration of function 'time' [-Wimplicit-function-declaration]|"
Run Code Online (Sandbox Code Playgroud)
运行编译文件时出现一个Windows错误报告,
我是c编程的新手,我在教科书上发现了这个,但它对我不起作用.
srand (time());
int x= (rand()%10) +1;
int y= (rand()%10) +1;
printf("\nx=%d,y=%d", x,y);
Run Code Online (Sandbox Code Playgroud)
我需要做些什么才能纠正这个问题?
在被认为有害的rand()中,它被指出srand(time(NULL))
是坏的,因为srand
需要一个unsigned int
,但对于Microsoft的编译器,time_t
默认情况下是64位数,因此发生缩小转换.但是,time_t
是实现定义的.
既然我看到srand(time(NULL))
如此普遍(即使在这个网站上),是否应该气馁?
对于使用的代码std::random_shuffle
,我需要设置一个随机种子,以便在每个程序运行中产生的伪随机序列不同.
srand ( unsigned ( time (NULL) ) );
Run Code Online (Sandbox Code Playgroud)
这需要
#include <ctime>
#include <cstdlib>
Run Code Online (Sandbox Code Playgroud)
我想知道:由于C++ 11包含伪随机数生成的主要更新,这仍然是最新的吗?我应该使用什么来设置随机种子std::random_shuffle
?
所以,我正在尝试创建一个随机向量(想想几何,而不是一个可扩展的数组),每当我调用我的随机向量函数时,我得到相同的x值,尽管y和z是不同的.
int main () {
srand ( (unsigned)time(NULL));
Vector<double> a;
a.randvec();
cout << a << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用该功能
//random Vector
template <class T>
void Vector<T>::randvec()
{
const int min=-10, max=10;
int randx, randy, randz;
const int bucket_size = RAND_MAX/(max-min);
do randx = (rand()/bucket_size)+min;
while (randx <= min && randx >= max);
x = randx;
do randy = (rand()/bucket_size)+min;
while (randy <= min && randy >= max);
y = randy;
do randz = (rand()/bucket_size)+min;
while (randz <= min && …
Run Code Online (Sandbox Code Playgroud) 每当我运行以下程序时,返回的值总是6或13.
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;
//void randomLegs();
//void randomPush();
//void randomPull();
//void randomMisc();
int main(int argc, const char * argv[])
{
srand(time(NULL));
//randomLegs();
cout << rand() % 14;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在今天和昨天,我已经将程序运行了近百次.
谁能告诉我我做错了什么?
谢谢.
编辑:顺便说一句,如果我将rand()的范围改为13或15,它就可以了.