您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: