NS-2随机数产生器

来源:互联网 发布:linux下游戏开发 编辑:程序博客网 时间:2024/04/29 08:15

NS-2随机数产生器:

 

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.仿真的网络结构图

    r1r2是两个路由器,其中的链路是采用first in first out(FIFO)的队列管理机制,频宽是10Mbps,传递的延迟时间是10ms。来源节点s1s2s3和目的节点d1d2d3之间有三条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


原创粉丝点击