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模拟使用一个固定的种子; 如果模拟中存在任何随机性,除非种子和/或运行号改变,否则每次运行程序将产生相同的结果
  • 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提供。这个类封装了随机数生成器并提供接口。子类:UniformVariableStreamExponetialVariableStram

   

仿真程序中,不改变种子或运行标识的前提下,仿真程序产生的结果的一定的

想要结果不一样,ns3::RngSeedManager::SetSeed()设置种子,或ns3::RngSeedManager::SetRun()设置运行标识

ns-3所有的随机变量使用一个基于全局固定的或随机的种子。

固定的种子和标识存储在类GlobalValueg_rngSeedg_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的种子和运行标识分别存储在类GlobalValueg_rngSeedg_rngRun中,改变PRNG的种子或者运行标识通过ns3::RngSeedManager::SetSeed()ns3::RngSeedmanager::SetRun()进行,下面对两种改变方式分别做介绍。

   

来自 <https://www.cnblogs.com/zywnnblog/p/13469856.html>

   

**需要注意的是:提倡使用改变运行标识的方法实现随机性。因为在改变种子的情况下进行重复试验,ns-3无法保证每个种子对应的RNG序列不会重复。而修改运行标识是使用RNG序列的不同的子序列,同一个RNG序列的子序列是不会重复的。

   

来自 <https://www.cnblogs.com/zywnnblog/p/13469856.html>

posted @ 2022-08-31 11:28  atomxing  阅读(264)  评论(0编辑  收藏  举报