随机数产生器(Random Number Generator)
[前言]
随机数产生器在NS2中是非常重要的,举凡网络节点在NAM中的位置或者是应用程序在何时开始传送或结束数据传输,都会用到随机数产生器。因此,在本节中,笔者将介绍如何在NS2中使用随机数产生器。
[种子(seed)和分布(distribution)]
随机数产生器所产生的数值是由种子和分布所控制的,不同的种子或者是分布就会产生出不同的随机数。我们可以这样思考,当一个种子和分布决定之后,随机数产生器会产生出一个表格,表格内是由一长串不同数字所组成,当我们需要一个随机数,随机数产生器就会去选取这个表格中第一个数字,当再需要另一个随机数,随机数产生器就会去选取这个表格中第二个数字,以此类推,所以当使用种子和分布相同时,得到的随机数会相同,若不同时,得到的随机数会不同。而在NS2中,若是种子的值为0的话,则表示每次执行程序的时候,随机数产生器都会在产生出不同的表格,也就是说每次得到的随机数都不相同。
[Creating Random Variable]
若是我们要在NS2中产生一个随机数产生器,并把种子设定为2,则可以把下面的程序代码放入tcl code中。
set rng [new RNG]
$rng seed 2
当random variable产生之后,接下来要决定分布,我们可以使用的分布有Pareto、Constant、Uniform、Exponential、或HyperExponentail 等等分布。
1. Pareto Distribution : 要提供expectation 和 shaper parameter β。
set r1 [new RandomVariable/Pareto]
$r1 use-rng $rng
$r1 set avg_ 10.0
$r1 set shape_ 1.2
2. Constant:
set r2 [new RandomVariable/Constant]
$r2 use-rng $rng
$r2 set avg_ 5.0
3. Uniform distribution: 要提供最小值和最大值
set r3 [new RandomVariable/Uniform]
$r3 use-rng $rng
$r3 set min_ 0.0
$r3 set max_ 10.0
4. Exponential distribution: 要提供平均值
set r4 [new RandomVariable/Exponential]
$r4 use-rng $rng
$r4 set avg_ 5
5. Hyperexponential distribution:
set r5 [new RandomVariable/HyperExponential]
$r5 use-rng $rng
$r5 set avg_ 1.0
$r5 set cov_ 4.0
[Tcl Code]
set rng [new RNG] $rng seed 2 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] } |
[执行结果]
Testing Pareto Distribution
7.323108e+02
1.034996e+01
3.241146e+01
Testing Constant Distribution
1.000000e+00
1.000000e+00
1.000000e+00
Testing Uniform Distribution
1.762401e+00
8.823415e+00
5.983056e+00
Testing Exponential Distribution
2.342635e+00
2.286844e+00
3.783593e+00
Testing HyperExponential Distribution
2.182741e-01
9.029152e-01
8.333935e-02
不管执行几次,结果都会相同,这是因为seed都固定为2。
若是把seed改为0,第一次执行
Testing Pareto Distribution
2.384032e+00
5.089023e+00
4.105111e+01
Testing Constant Distribution
1.000000e+00
1.000000e+00
1.000000e+00
Testing Uniform Distribution
1.244962e+00
7.089372e+00
9.505300e+00
Testing Exponential Distribution
6.821317e-01
1.152453e+00
5.977962e+00
Testing HyperExponential Distribution
2.182741e-01
9.029152e-01
8.333935e-02
若是把seed改为0,第二次执行
Testing Pareto Distribution
2.095560e+00
3.138167e+00
4.567834e+00
Testing Constant Distribution
1.000000e+00
1.000000e+00
1.000000e+00
Testing Uniform Distribution
2.799521e+00
3.294468e-01
4.339498e+00
Testing Exponential Distribution
8.149149e-01
1.027426e+00
4.275210e+00
Testing HyperExponential Distribution
2.182741e-01
9.029152e-01
8.333935e-02
可以看出当seed为0时,Pareto、Uniform、Exponential所得到的结果会不相同。
参考地址:http://wenku.baidu.com/view/e0320cd87f1922791688e82e.html###