NS3 模拟结果可以不一样!!!
https://www.nsnam.org/docs/release/3.5/manual/manual_2.html#SEC2
1.1 Quick Overview
1.1快速概述
ns-3 random numbers are provided via instances of class RandomVariable.
Ns-3随机数通过类 RandomVariable 的实例提供。
-
by default, ns-3 simulations use a fixed seed; if there is any randomness in the simulation, each run of the program will yield identical results uniess the seed and/or run number is changed.
- in ns-3.3 and earlier, ns-3 simulations used a random seed by default; this marks a change in policy starting with ns-3.4
在缺省情况下,ns-3模拟使用一个固定的种子; 如果模拟中存在任何随机性,除非种子和/或运行号改变,否则每次运行程序将产生相同的结果
- in ns-3.3 and earlier, ns-3 simulations used a random seed by default; this marks a change in policy starting with ns-3.4
- to obtain randomness across multiple simulation runs, you must either set the seed differently or set the run number differently. To set a seed, call 为了在多次模拟运行中获得随机性,你必须要么改变种子,要么改变运行次数。要设置种子,请调用SeedManager::SetSeed(uint32_t) at the beginning of the program; to set a run number with the same seed, call 在程序的开头; 要设置具有相同种子的运行号,请调用SeedManager::SetRun (uint32_t) at the beginning of the program; See section 在程序的开始部分; 参见Seeding and independent replications 播种和独立重复试验
- each RandomVariable used in ns-3 has a virtual random number generator associated with it; all random variables use either a fixed or random seed based on the use of the global seed (previous bullet); Ns-3中使用的每个随机变量都有一个虚拟随机数发生器,所有随机变量使用基于全局种子的固定或随机种子(以前的项目符号) ;
- if you intend to perform multiple runs of the same scenario, with different random numbers, please be sure to read the section on how to perform independent replications: See section 如果您打算用不同的随机数对同一场景执行多次运行,请务必阅读关于如何执行独立复制的部分: 参见部分Seeding and independent replications 播种和独立重复试验.
Read further for more explanation about the random number facility for ns-3.
进一步阅读更多关于 ns-3的随机数设施的解释。
学了这么就ns3 真就白学了哦
模拟总是出现一个一模一样的结果 ns3也是离散事件模拟器 为什么会这样呢
直到今天看别人的文章才知道 无语子(其他部分也很值得看,作用很大)
https://blog.csdn.net/bajiaoyu517/article/details/120148610
结论: 推荐使用这个 修改不同的参数值即可获得不同的运行标识 即不同结果
在int main()后加入
RngSeedManager::SetRun(3);
seed 和 run的默认值都是1
5.2 随机变量Random Variables
随机数生成器(RNG)
随机变量通过调用类ns3::RandomVariableStream提供。这个类封装了随机数生成器并提供接口。子类:UniformVariableStream和ExponetialVariableStram。
仿真程序中,不改变种子或运行标识的前提下,仿真程序产生的结果的一定的。
想要结果不一样,ns3::RngSeedManager::SetSeed()设置种子,或ns3::RngSeedManager::SetRun()设置运行标识。
ns-3所有的随机变量使用一个基于全局固定的或随机的种子。
固定的种子和标识存储在类GlobalValue的g_rngSeed和g_rngRun成员中。
同一仿真程序多次实验,若要实现每次实验都具有独立性,有两种方法:
(提倡使用改变运行标识的方法实现随机性)
方法一:每次独立重复实验时,调用函数RngSeedManager::SetSeed()设置不同的全局种子。
//在scratch文件夹下,创建文件sample-random-variable-stream.cc
# include "ns3/simulator.h"
# include "ns3/nstime.h"
# include "ns3/command-line.h"
# include "ns3/rng-seed-manager.h"
# include "ns3/random-variable-stream.h"
# include <iostream>
using namespace ns3;
int main(int argc,char *argv[])
{
CommandLine cmd;
cmd.Parse(argc, argv);
RngSeedManager::SetSeed(1);//改为SetSeed(2)结果也会变化
Ptr<UniformRandomVariable> uv=CreateObject<UniformRandomVariable>();//创建一个指向随机变量类的指针uv
std::cout << uv->GetValue() << std::endl;
return 0;
}
# 运行
./waf --run scratch/sample-random-variable-stream
# 不改代码的话,每次运行输出同样的数字[0,1),例如0.816532
方法二:每次独立重复实验时,全局种子不变,每次设置不同的标识。改变标识有几种方式:
a. 调用函数RngSeedManager::SetRun(3)设置不同的运行标识。
// 修改文件代码
RngSeedManager::SetRun(3);//这一句代替RngSeedManager::SetSeed(1);
b. 修改全局变量NS_GLOBAL_VALUE值来修改运行标识。
# 运行
# ./waf --run scratch/sample-random-variable-stream
NS_GLOBAL_VALUE="RngRun=3" ./waf --run scratch/sample-random-variable-stream # RngRun=可以取不同的值
c(推荐). 使用命令行传递参数修改运行标识
# 运行
./waf --run "scratch/sample-random-variable-stream --RngRun=3"
d. 使用build
# 运行
./build/optimized/scratch/sample-random-variable-stream --RngRun=3
测试了一次发现不设置标识值的话 应该默认是1 没多进行测试
在ns-3中,仿真程序通常使用固定的种子,也就是产生固定的随机数,也就是固定的数值,所以仿真也就不存在不确定性,也即确定性仿真。
如果需要模拟不确定的情况,则需要改变PRNG的种子或者运行标识。
ns-3的随机数通过调用类ns3::RandomVariableStream来提供(在3.14版本及之前有ns3::Random Variable提供)。ns3::RandomVariableStream是对底层的随机数生成器进行封装之后向用户提供的使用接口。
PRNG的种子和运行标识分别存储在类GlobalValue的g_rngSeed和g_rngRun中,改变PRNG的种子或者运行标识通过ns3::RngSeedManager::SetSeed()和ns3::RngSeedmanager::SetRun()进行,下面对两种改变方式分别做介绍。
来自 <https://www.cnblogs.com/zywnnblog/p/13469856.html>
**需要注意的是:提倡使用改变运行标识的方法实现随机性。因为在改变种子的情况下进行重复试验,ns-3无法保证每个种子对应的RNG序列不会重复。而修改运行标识是使用RNG序列的不同的子序列,同一个RNG序列的子序列是不会重复的。