离散事件模拟在windows和linux中生成不同的结果
Discrete Event simulation generates different results in windows and linux
我正在进行m/m/2/2离散事件模拟。结果与理论值相同,这意味着程序是正确的(在Ubuntu中,g++)。然而,当我在windows(visualstudio)中再次测试代码时,只有当试用次数少于10000时,结果才是正确的。我调试了很长时间,最后发现我必须使用(double) rand() / ( RAND_MAX + 1 )
而不仅仅是(double) rand() / RAND_MAX
。
为什么?这两个编译器是否以不同的方式生成随机?
#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <cmath>
#include "iomanip"
#include <queue>
using namespace std;
#define TRIAL_NUM 10000000
//structure that represent a customer
struct cust
{
int cust_id;
double arrival_time;
double depart_time;
};
//uniform random generator
double uniRand()
{
return (double) rand() / RAND_MAX;
}
//exponential random generator
double expRand(double lam)
{
double u,x;
u=uniRand();
x=(-1/lam)*log(1-u);
return(x);
}
int main()
{
//seed the random generator
srand (time(NULL));
//queue that hold all customers
std::queue<cust*> customers;
double lam = 0, mu = 0;
bool showStatus = false;
cout<<"M/M/1/1 Discrete Event Simulation with "<<TRIAL_NUM<<" customersn"<<" Please spacify the value of lambda:";
cin>>lam;
while(lam<= 0)
{
cout<<"lambda value must be a positive number, try again:";
cin>>lam;
}
cout<<"Please specify the value of mu:";
cin>>mu;
while(mu<= 0)
{
cout<<"lambda value must be a positive number, try again:";
cin>>mu;
}
cout<<"Show status for each customer? (y/n)";
char show;
cin>>show;
while( tolower(show) != 'y' && tolower(show) != 'n')
{
cout<<"Invalid input, try again:";
cin>>show;
}
if ( tolower(show) =='y' )
{
showStatus = true;
}
//Generating all arrival time, service time for all customers
double temp_time = 1;
cust* temp;
for (int i = 1; i <= TRIAL_NUM; ++i)
{
temp= new cust;
temp -> arrival_time = temp_time + expRand(lam);
temp_time = temp->arrival_time;
temp->depart_time = temp->arrival_time + expRand(mu);
temp->cust_id = i;
customers.push(temp);
}
//Blocking customer count
double block = 0;
bool blockFlag = false;
temp = customers.front();
double server1 = 0, server2 = 0;
//perform simulation
while( !customers.empty())
{
if ( server1 < temp->arrival_time)
{
server1 = temp->depart_time;
}
else if ( server2 < temp->arrival_time)
{
server2 = temp->depart_time;
}
else
{
block++;
blockFlag = true;
}
if (showStatus)
{
cout<<"Customer "<<temp->cust_id<<"tarrived at:"<<temp->arrival_time<<"tservice time:"<<temp->depart_time<<"tstatus:";
if (blockFlag)
{
cout<<"Blocked"<<endl;
}
else{
cout<<"Served"<<endl;
}
}
customers.pop();
if (!customers.empty())
{
temp = customers.front();
}
blockFlag = false;
}
cout<<"Blocking probability is: "<<block/TRIAL_NUM<<endl;
return 0;
}
(double) rand() / (RAND_MAX + 1)
是一个危险的表达式。
如果经常发生RAND_MAX
等于INT_MAX
,则RAND_MAX + 1
是溢出和未定义的行为(它通常导致INT_MIN
,但任何规范都不能保证这一点)。
在Visual C++中,RAND_MAX
是32767,您没有这个问题(但32767是一个小值,它会很快"开始循环")。
无论如何,我认为真正的问题在这里:
u = uniRand();
x = (-1 / lam) * log(1 - u);
当uniRand()
被定义为(double) rand() / RAND_MAX
时,它会产生范围内的值:
0.0 <= uniRand() <= 1.0
当该值等于1.0时,您的CCD_ 11中会出现极点误差。在Visual C++中,由于RAND_MAX
的值较小,这种情况会更频繁地发生。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在C++/Linux中设置单调时钟的一些技巧
- valgrind-hellgrind与泄漏检查的结果不同
- SACSegmentation Linux 和 Windows 的结果不同
- 当与Windows和Linux下的Ifstream相反的二进制文件时,结果不同
- std::vector 在 Linux 和 Windows 中给出了不同的结果
- 我在Windows和Linux中得到了不同的结果!C++代码
- OpenCV在Windows和Linux上有不同的结果
- Linux PURF工具显示怪异的缓存结果
- 从 C 代码 system() 函数执行的 Linux 命令与从终端执行时给出的结果不同
- 如何在Linux上获得C 代码块的时钟刻度?clock()结果没有意义
- Windows与Linux的数学结果差异
- 操作系统Windows和Linux的结果不同
- 正弦函数的结果在微软和Java / Linux之间不同
- 如何获得C++ Mersenne Twister 19937生成器在Windows和Linux上给出相同的结果
- 在c++代码中添加人为延迟时会产生奇怪的结果.嵌入式Linux
- 如何在Linux上的c++中将数据管道到bzip2中并从其标准输出中获得结果数据?
- 如何在Linux上使用php获得c++编译结果
- 离散事件模拟在windows和linux中生成不同的结果
- 在linux CFS调度下的C/ c++多线程场景中出现意外结果