Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ srand(time(NULL))生成类似的结果_C++_Visual Studio_Visual Studio 2010_Random - Fatal编程技术网

C++ srand(time(NULL))生成类似的结果

C++ srand(time(NULL))生成类似的结果,c++,visual-studio,visual-studio-2010,random,C++,Visual Studio,Visual Studio 2010,Random,我不明白为什么srand()在两次运行之间生成如此相似的随机数 我正在尝试运行以下代码 srand ( time(NULL) ); int x = rand(); cout << x << endl; 确定你在做什么 srand ( time(NULL) ); while(condition) { int x = rand(); cout << x << endl; } srand(时间(空)); while(条件){ int

我不明白为什么srand()在两次运行之间生成如此相似的随机数

我正在尝试运行以下代码

srand ( time(NULL) );
int x = rand();
cout << x << endl;
确定你在做什么

srand ( time(NULL) );
while(condition) {
    int x = rand();
    cout << x << endl;
}
srand(时间(空));
while(条件){
int x=rand();

cout如果您试图连续快速运行程序并每次获得不同的随机数,则使用当前时间初始化是错误的方法。您需要的是一个熵源;可能会让您启动。将
time(NULL)
替换为
QueryPerformanceCounter()
可能是一个好的开始,因为它更新得更快,但它仍然是可以预测的-我不知道这对你是否重要。

好的,所有的学分都是为了马克·兰森(Mark Ransom)解释实际发生了什么。我在他的链接问题中没有找到源代码,所以我搜索了它,发现了这个,什么是perfec因此,对于Windows上的srand,以下是生成更好的srand()种子的源代码

#包括
int main()
{
大环;
QueryPerformanceCounter(&cicles);
srand(cicles.QuadPart);
返回0;
}
首先,它不是一个随机函数;它设置了起点 一个伪随机序列。令人惊讶的是 的实现似乎返回了一个基于 以前的状态,而不是新计算的状态,因此 调用
srand()
后的值在很大程度上取决于传递给的值
srand()
。如果要编写:

srand( time( NULL ) );
rand();
std::cout << rand() << std::endl;
在Windows下使用VC++时,您会注意到 第一次调用
rand()
-和

1256800221 286343522
955907524 101665620
1731118607 991002476
1428701871 807009391
44395298 1688573463
817243457 1506183315
507034261 1310184381
1278902902 54648487
2049484769 942368151
1749966544 1833343137
在Windows下使用g++时;在这种情况下,即使是读取的第一个值也是 相对随机的

如果你需要一个好的随机发生器,你可能必须使用一个 来自Boost;该标准没有对算法应该是什么做太多说明
使用和实现在质量上有很大的不同。

< P>因为你有VisualStudio 2010,你可以使用从现代C++代替时间()来移植种子Srand():

#包括
#包括
#包括
int main()
{
std::随机_装置rd;
std::srand(rd());

std::cout从@James Kanze的测试来看,这似乎是VC++的C运行时的一个特点(尽管我确信其他库也有同样的问题)。这个库也有一个问题,但这是另一个问题

初始值的低方差的解决方案只是将其丢弃:

void seed_rand( unsigned int seed )
{
    srand( seed ) ;
    (void)rand() ;
}

int main()
{
    seed_rand( time( NULL ) );
    int r1 = rand();
    std::cout << r1 << ' ' << rand() << std::endl;
    return 0;
}
void seed\u rand(无符号整数seed)
{
srand(种子);
(无效)兰德();
}
int main()
{
种子随机数(时间(空));
int r1=rand();

std::cout我也遇到了同样的问题。即使在几十秒之后,种子也太相似了。因为我是以这种方式得到我的数字的:

int FlRandomInt(int LowerLimit, int UpperLimit)
{
 int Result;
 Result = rand();
 Result=LowerLimit+Result*(UpperLimit-LowerLimit)/RAND_MAX;

 return Result;
}
我知道这不是计算整数的最佳方法,但我使用相同的过程来生成随机浮点和双精度,因此最好验证它们是否有显著差异,而不仅仅是最后的小数

无论如何,我只是想发布一个对我来说很好的解决方案。它只是将时间种子乘以100:

srand(( unsigned )time( 0 ) * 100 );
希望它有帮助,即使我确信问题有更优雅的方式。

<代码>包含C++的“STDIO .H”/RMV编码。
#include"stdio.h" //rmv coding for randam number access using c++

 #include"conio.h"

 #include"time.h"

void main()

{

time_t t;

int i;

srand(time(null));

for(i=1;i<=10;i++)

cout<<(unsigned)rand()%100-90<<"\t";

for(i=1;i<=10;i++)

cout<<(char)rand()%100-90<<"\t";


getch();

}
#包括“conio.h” #包括“time.h” void main() { 时间; int i; srand(时间(空));
(i=1;每次调用<代码> RAND())/>代码>,是否播种?只需一次种子!您用当前时间初始化,并怀疑它为什么缓慢增加?我到处都读过它是在C++应用程序中初始化SRAND的正确方法。.从字里行间看,我猜你的程序只产生一个数字,而你正在运行它多次-对吗?是的,
srand
使用类似的种子启动时产生类似的结果是完全正常的。后者不起作用的原因是因为当前时间更新的频率不够,是吗o许多迭代将读取相同的时间,因此使用相同的种子。我是这样做的。int main(int argc,char*argv[]){srand(time(NULL))..该代码不会打印出多个结果。您给了我们一系列数字,但您显示的唯一代码只打印出一个数字。此外,理论上的
while
可能只是程序的多次运行。很高兴知道如何使用
QueryPerformanceCounter()进行种子设定
@Kyle,不幸的是QueryPerformanceCounter仅适用于Windows。Linux使用/dev/random有一个更好的解决方案,尽管它涉及打开和关闭一个文件。@Mark
time
似乎是最好的可移植解决方案,但大多数系统都有很多不同的值可供使用。很长一段时间以来,我都使用散列e> 时间
,进程id和机器IP地址,这样两个人同时启动程序时仍然会得到完全不同的序列。(当然,
/dev/random
更好,这是我今天在Unix下使用的。)这里:酷,这是我的新版本。它是当前标准的一部分,还是C++0x扩展?@Mark Ransom它是TR1扩展的一部分,包含在C++0xCall a dummy rand()中;在srand()之后;使其更独特。或者使用我回答中的代码:大约五年前,我们产品的Windows版本的生产代码遇到了这个问题。解决方案是在种子设定后,仅对Windows使用第一个rand()调用。我进行了广泛的分析(数十亿个样本)对于Windows、AIX和Linux,并且在所有三个测试环境中都得到了可接受的、相似的结果。我还花时间使用了更好的种子值(进程的当前时间(以毫秒为单位%32000+pid,诸如此类)。
1256800221 286343522
955907524 101665620
1731118607 991002476
1428701871 807009391
44395298 1688573463
817243457 1506183315
507034261 1310184381
1278902902 54648487
2049484769 942368151
1749966544 1833343137
#include <iostream>
#include <random>
#include <cstdlib>
int main()
{
    std::random_device rd;
    std::srand(rd());
    std::cout << std::rand() << '\n';
}
void seed_rand( unsigned int seed )
{
    srand( seed ) ;
    (void)rand() ;
}

int main()
{
    seed_rand( time( NULL ) );
    int r1 = rand();
    std::cout << r1 << ' ' << rand() << std::endl;
    return 0;
}
int FlRandomInt(int LowerLimit, int UpperLimit)
{
 int Result;
 Result = rand();
 Result=LowerLimit+Result*(UpperLimit-LowerLimit)/RAND_MAX;

 return Result;
}
srand(( unsigned )time( 0 ) * 100 );
#include"stdio.h" //rmv coding for randam number access using c++

 #include"conio.h"

 #include"time.h"

void main()

{

time_t t;

int i;

srand(time(null));

for(i=1;i<=10;i++)

cout<<(unsigned)rand()%100-90<<"\t";

for(i=1;i<=10;i++)

cout<<(char)rand()%100-90<<"\t";


getch();

}