NS2学习笔记——随机数产生器
2014-02-28 22:13
281 查看
了解如何在网络仿真过程中应用随机数产生器。
1.随机数产生器所产生的数值是由种子和分布所控制的,不同的种子或者是 分布就会产生不同的随机数。当一个种子和分布决定之后,随机数产生器会产生一出一个由一长串不同数字所组成的表格,当需要一个 随机数时,随机数产生器就会去选取这个表格中的一个数字,当需要另一个随机数时,随机数产生器就会去选取这个表格中第二个数字,依此类推。所以当使用种子 和分布相同时,得到的随机数就会相同;若不同时,得到的随机数就会不同。在NS2中, 若种子的值是0,表示 每次执行程序的时候,随机数产生器都会产生出不同的表格,也就是说每次的得到随机数都不相同。
2.设置种子
若要在NS2中产生一个随机数产生器,并把种子设置为1,则可以把下的程序代码放入tcl code中。
set rng [new RNG]
$rng seed 1
3.设置分布
在NS2中所提供的分布有Pareto,Constant,Uniform,Exponential或HyperExponentail等。
(1)Pareto Distribution: 要提供expectation (avg_)和shaper parameter (shape_)参数,实例如下:
set r1 [new RandomVariable/Pareto]
$r1 use-rng $rng
$r1 set avg_ 10.0
$r1 set shape_ 1.2
(2)Constant:要提供平均值(avg_)参数,实例如下所示.
set r2 [new RandomVariable/Constant]
$r2 use-rng $rng
$r2 set avg_ 5.0
(3)Uniform Distribution :要提供最小值(min_)和最大值(max_)参数,实例如下所示:
set r3 [new RandomVariable/Uniform]
$r3 use-rng $rng
$r3 set min_ 0.0
$r3 set max_ 10.0
(4)Exponential Distribution:要提供平均值(avg_)参数,实例如下所示:
set r4 [new RandomVariable/Exponential]
$r4 use-rng $rng
$r4 set avg_ 5
(5)Hyperexponential Distribution:要提供平均值(avg_)和cov_参数,实例如下所示:
set r5 [new RandomVariable/HyperExponential]
$r5 use-rng $rng
$r5 set avg_ 1.0
$r5 set cov_ 4.0
测试随机数产生器:
set rng [new RNG]
$rng seed 1
puts "Testing Pareto Distribution"
set r1 [new RandomVariable/Pareto]
$r1 use-rng $rng
$r1 set avg_ 10.0
$r1 set shape_ 1.2
for {set i 1} {$i<=3} {incr i} {
puts [$r1 value]
}
puts "Testing Constant Distribution"
set r2 [new RandomVariable/Constant]
$r2 use-rng $rng
$r2 set avg_ 5.0
for {set i 1} {$i<=3} {incr i} {
puts [$r2 value]
}
puts "Testing Uniform Distribution"
set r3 [new RandomVariable/Uniform]
$r3 use-rng $rng
$r3 set min_ 0.0
$r3 set max_ 10.0
for {set i 1} {$i<=3} {incr i} {
puts [$r3 value]
}
puts "Testing Exponential Distribution"
set r4 [new RandomVariable/Exponential]
$r4 use-rng $rng
$r4 set avg_ 5
for {set i 1} {$i<=3} {incr i} {
puts [$r4 value]
}
puts "Testing HyperExponential Distribution"
set r5 [new RandomVariable/HyperExponential]
$r5 use-rng $rng
$r5 set avg_ 1.0
$r5 set cov_ 4.0
for {set i 1} {$i<=3} {incr i} {
puts [$r5 value]
}
一个在网络仿真中应用到随机数产生器的完整实例:
1.仿真的网络结构图
r1和r2是两个路由器,其中的链路是采用first in first out(FIFO)的队列管 理机制,频宽是10Mbps, 传递的延迟时间是10ms。 来源节点s1、s2、s3和目的节点d1、d2、d3之间有三条FTP数据流,而这三条FTP数据流的起始时间是由随机数所产生的,但是时间都是1-3s,且每条数据流都会传送5s。
2.效果评比指标:吞吐量 (Throughput)
定义:单位时间内,所有目的结点的平均接收数据速率
Throughput=(某段时间内所有目的结点的数据接收量)/(统计的这段时间)
另外要补充一点的,在论文的实验中,在计算数据接收量并不是从模拟的起始时间就开始统计,而是让模拟经过一段 时间,进入稳态才会开始统计。
3.TCL程序代码(lab4_2.tcl)
set ns [new Simulator]
#打开一个trace file,用来记录封装包传送过程
set nd [open out.tr w]
$ns trace-all $nd
#打开一个NAM记录文件
set nf [open out.nam w]
$ns namtrace-all $nf
#设置TCP flow的数目
set nflow 3
#设置路由器
set r1 [$ns node]
set r2 [$ns node]
$ns duplex-link $r1 $r2 1Mb 10ms DropTail
#设置queue limit为10个packet
$ns queue-limit $r1 $r2 10
#设置TCP的来源节点和目的节点
#建立来源和目的节点与路由器的链路
for { set i 1 } { $i<=$nflow } { incr i } {
set s($i) [$ns node]
set d($i) [$ns node]
$ns duplex-link $s($i) $r1 10Mb 1ms DropTail
$ns duplex-link $r2 $d($i) 10Mb 1ms DropTail
}
#建立TCP的联机,并在TCP联机上建立FTP应用程序
for { set i 1 } { $i<=$nflow } { incr i } {
set tcp($i) [new Agent/TCP]
set sink($i) [new Agent/TCPSink]
$ns attach-agent $s($i) $tcp($i)
$ns attach-agent $d($i) $sink($i)
$ns connect $tcp($i) $sink($i)
set ftp($i) [new Application/FTP]
$ftp($i) attach-agent $tcp($i)
$ftp($i) set type_ FTP
}
set rng [new RNG]
$rng seed 1
set RVstart [new RandomVariable/Uniform]
$RVstart set min_ 0
$RVstart set max_ 1
$RVstart use-rng $rng
#由随机数产生器去 决定每一条flow的起始时间(在0~1s之内)
#每条flow传输5s,并在指定的时间,让ftp开始传输和结束
for {set i 1} {$i<=$nflow} {incr i} {
set startT($i) [expr [$RVstart value]]
puts "startT($i) $startT($i) sec"
set endT($i) [expr ($startT($i)+5)]
puts "endT($i) $endT($i) sec"
$ns at $startT($i) "$ftp($i) start"
$ns at $endT($i) "$ftp($i) stop"
}
proc finish {} {
global ns nd nf
close $nd
close $nf
$ns flush-trace
exec nam out.nam &
exit 0
}
#在第7秒时去调用finish函数来结束模拟
$ns at 7.0 "finish"
#执行模拟
$ns run
4.分析awk程序代码(4_2.awk)
BEGIN{
init=0;
startT=0;
endT=0;
}
{
action=$1;
time=$2;
from=$3;
to=$4;
type=$5;
pktsize=$6;
flow_id=$8;
node_1_address=$9;
node_2_address=$10;
seq_no=$11;
packet_id=$12;
#记录类型是tcp 动作是dequeue 发生事件的时间介于1.0-5.0
#由于新增结点时,结点建立的顺序为r1 r2 s1 d1 s2 d2 s3 d3 所以相对的
#结点id就为0 1 2 3 4 5 6 7
if(action=="r"&&type=="tcp"&&time>=1.0&&time<=5.0&&((from==1&&to==3)||(from==1&&to==5) || (from==1&&to==7))) {
if(init==0) {
starT=time;
init=1;
}
#记录在这段时间中离开队列的封包大小总和(in bytes)
pkt_byte_sum+=pktsize;
endT=time;
}
}
END {
#计算1.0-5.0s的平均带宽
printf("startT:%f endT:%f \n",startT,endT);
printf("pkt_byte_sum:%d \n",pkt_byte_sum);
time=endT-startT;
throughput=pkt_byte_sum*8/time/1000000;
printf("throughput:%.3f Mbps \n",throughput);
}
5.执行方法:
$ns lab4_2.tcl
$awk -f 4_2.awk out.tr
6.执行结果:
startT:0.000000 endT:4.993908
pkt_byte_sum:491960
throughput:0.788 Mbps
http://blog.sina.com.cn/s/blog_5cf8cdff0100hl9q.html
1.随机数产生器所产生的数值是由种子和分布所控制的,不同的种子或者是 分布就会产生不同的随机数。当一个种子和分布决定之后,随机数产生器会产生一出一个由一长串不同数字所组成的表格,当需要一个 随机数时,随机数产生器就会去选取这个表格中的一个数字,当需要另一个随机数时,随机数产生器就会去选取这个表格中第二个数字,依此类推。所以当使用种子 和分布相同时,得到的随机数就会相同;若不同时,得到的随机数就会不同。在NS2中, 若种子的值是0,表示 每次执行程序的时候,随机数产生器都会产生出不同的表格,也就是说每次的得到随机数都不相同。
2.设置种子
若要在NS2中产生一个随机数产生器,并把种子设置为1,则可以把下的程序代码放入tcl code中。
set rng [new RNG]
$rng seed 1
3.设置分布
在NS2中所提供的分布有Pareto,Constant,Uniform,Exponential或HyperExponentail等。
(1)Pareto Distribution: 要提供expectation (avg_)和shaper parameter (shape_)参数,实例如下:
set r1 [new RandomVariable/Pareto]
$r1 use-rng $rng
$r1 set avg_ 10.0
$r1 set shape_ 1.2
(2)Constant:要提供平均值(avg_)参数,实例如下所示.
set r2 [new RandomVariable/Constant]
$r2 use-rng $rng
$r2 set avg_ 5.0
(3)Uniform Distribution :要提供最小值(min_)和最大值(max_)参数,实例如下所示:
set r3 [new RandomVariable/Uniform]
$r3 use-rng $rng
$r3 set min_ 0.0
$r3 set max_ 10.0
(4)Exponential Distribution:要提供平均值(avg_)参数,实例如下所示:
set r4 [new RandomVariable/Exponential]
$r4 use-rng $rng
$r4 set avg_ 5
(5)Hyperexponential Distribution:要提供平均值(avg_)和cov_参数,实例如下所示:
set r5 [new RandomVariable/HyperExponential]
$r5 use-rng $rng
$r5 set avg_ 1.0
$r5 set cov_ 4.0
测试随机数产生器:
set rng [new RNG]
$rng seed 1
puts "Testing Pareto Distribution"
set r1 [new RandomVariable/Pareto]
$r1 use-rng $rng
$r1 set avg_ 10.0
$r1 set shape_ 1.2
for {set i 1} {$i<=3} {incr i} {
puts [$r1 value]
}
puts "Testing Constant Distribution"
set r2 [new RandomVariable/Constant]
$r2 use-rng $rng
$r2 set avg_ 5.0
for {set i 1} {$i<=3} {incr i} {
puts [$r2 value]
}
puts "Testing Uniform Distribution"
set r3 [new RandomVariable/Uniform]
$r3 use-rng $rng
$r3 set min_ 0.0
$r3 set max_ 10.0
for {set i 1} {$i<=3} {incr i} {
puts [$r3 value]
}
puts "Testing Exponential Distribution"
set r4 [new RandomVariable/Exponential]
$r4 use-rng $rng
$r4 set avg_ 5
for {set i 1} {$i<=3} {incr i} {
puts [$r4 value]
}
puts "Testing HyperExponential Distribution"
set r5 [new RandomVariable/HyperExponential]
$r5 use-rng $rng
$r5 set avg_ 1.0
$r5 set cov_ 4.0
for {set i 1} {$i<=3} {incr i} {
puts [$r5 value]
}
一个在网络仿真中应用到随机数产生器的完整实例:
1.仿真的网络结构图
r1和r2是两个路由器,其中的链路是采用first in first out(FIFO)的队列管 理机制,频宽是10Mbps, 传递的延迟时间是10ms。 来源节点s1、s2、s3和目的节点d1、d2、d3之间有三条FTP数据流,而这三条FTP数据流的起始时间是由随机数所产生的,但是时间都是1-3s,且每条数据流都会传送5s。
2.效果评比指标:吞吐量 (Throughput)
定义:单位时间内,所有目的结点的平均接收数据速率
Throughput=(某段时间内所有目的结点的数据接收量)/(统计的这段时间)
另外要补充一点的,在论文的实验中,在计算数据接收量并不是从模拟的起始时间就开始统计,而是让模拟经过一段 时间,进入稳态才会开始统计。
3.TCL程序代码(lab4_2.tcl)
set ns [new Simulator]
#打开一个trace file,用来记录封装包传送过程
set nd [open out.tr w]
$ns trace-all $nd
#打开一个NAM记录文件
set nf [open out.nam w]
$ns namtrace-all $nf
#设置TCP flow的数目
set nflow 3
#设置路由器
set r1 [$ns node]
set r2 [$ns node]
$ns duplex-link $r1 $r2 1Mb 10ms DropTail
#设置queue limit为10个packet
$ns queue-limit $r1 $r2 10
#设置TCP的来源节点和目的节点
#建立来源和目的节点与路由器的链路
for { set i 1 } { $i<=$nflow } { incr i } {
set s($i) [$ns node]
set d($i) [$ns node]
$ns duplex-link $s($i) $r1 10Mb 1ms DropTail
$ns duplex-link $r2 $d($i) 10Mb 1ms DropTail
}
#建立TCP的联机,并在TCP联机上建立FTP应用程序
for { set i 1 } { $i<=$nflow } { incr i } {
set tcp($i) [new Agent/TCP]
set sink($i) [new Agent/TCPSink]
$ns attach-agent $s($i) $tcp($i)
$ns attach-agent $d($i) $sink($i)
$ns connect $tcp($i) $sink($i)
set ftp($i) [new Application/FTP]
$ftp($i) attach-agent $tcp($i)
$ftp($i) set type_ FTP
}
set rng [new RNG]
$rng seed 1
set RVstart [new RandomVariable/Uniform]
$RVstart set min_ 0
$RVstart set max_ 1
$RVstart use-rng $rng
#由随机数产生器去 决定每一条flow的起始时间(在0~1s之内)
#每条flow传输5s,并在指定的时间,让ftp开始传输和结束
for {set i 1} {$i<=$nflow} {incr i} {
set startT($i) [expr [$RVstart value]]
puts "startT($i) $startT($i) sec"
set endT($i) [expr ($startT($i)+5)]
puts "endT($i) $endT($i) sec"
$ns at $startT($i) "$ftp($i) start"
$ns at $endT($i) "$ftp($i) stop"
}
proc finish {} {
global ns nd nf
close $nd
close $nf
$ns flush-trace
exec nam out.nam &
exit 0
}
#在第7秒时去调用finish函数来结束模拟
$ns at 7.0 "finish"
#执行模拟
$ns run
4.分析awk程序代码(4_2.awk)
BEGIN{
init=0;
startT=0;
endT=0;
}
{
action=$1;
time=$2;
from=$3;
to=$4;
type=$5;
pktsize=$6;
flow_id=$8;
node_1_address=$9;
node_2_address=$10;
seq_no=$11;
packet_id=$12;
#记录类型是tcp 动作是dequeue 发生事件的时间介于1.0-5.0
#由于新增结点时,结点建立的顺序为r1 r2 s1 d1 s2 d2 s3 d3 所以相对的
#结点id就为0 1 2 3 4 5 6 7
if(action=="r"&&type=="tcp"&&time>=1.0&&time<=5.0&&((from==1&&to==3)||(from==1&&to==5) || (from==1&&to==7))) {
if(init==0) {
starT=time;
init=1;
}
#记录在这段时间中离开队列的封包大小总和(in bytes)
pkt_byte_sum+=pktsize;
endT=time;
}
}
END {
#计算1.0-5.0s的平均带宽
printf("startT:%f endT:%f \n",startT,endT);
printf("pkt_byte_sum:%d \n",pkt_byte_sum);
time=endT-startT;
throughput=pkt_byte_sum*8/time/1000000;
printf("throughput:%.3f Mbps \n",throughput);
}
5.执行方法:
$ns lab4_2.tcl
$awk -f 4_2.awk out.tr
6.执行结果:
startT:0.000000 endT:4.993908
pkt_byte_sum:491960
throughput:0.788 Mbps
http://blog.sina.com.cn/s/blog_5cf8cdff0100hl9q.html
相关文章推荐
- NS2学习笔记
- NS2学习笔记 在一个节点上同时使用不同的应用层协议
- NS2 学习笔记(一)
- NS2 学习笔记—— AODV协议
- NS2学习笔记
- 网络仿真技术-NS2(学习笔记)
- NS2学习笔记
- NS2学习笔记(五)
- NS2学习笔记2:octl与c++对象的关联
- NS2 学习笔记(二)
- NS2 学习笔记—— AODV协议
- NS2无线模拟课程学习笔记
- NS2学习笔记---ns2模拟仿真的一般过程及要点
- 线程学习笔记(2)-互斥对象
- javascript 学习笔记之表格排序
- SQL Server学习笔记之一(DBA的工作到底有哪些)
- 传智博客课堂学习笔记3.29
- 设计模式之Prototype的学习笔记
- Entity Framework 4.1 Code-First 学习笔记
- JBPM5学习笔记