tcl中如何产生随机数

[前言]

        亂數產生器在NS2中是非常重要的,舉凡網路節點在NAM中的位置或者是應用程式在何時開始傳送或結束資料傳輸,都會用到亂數產生器。因此,在本節中,筆者將介紹如何在NS2中使用亂數產生器。

 

[種子(seed)和分佈(distribution)]

        亂 數產生器所產生的數值是由種子和分佈所控制的,不同的種子或者是分佈就會產生出不同的亂數。我們可以這樣思考,當一個種子和分佈決定之後,亂數產生器會產 生出一個表格,表格內是由一長串不同數字所組成,當我們需要一個亂數,亂數產生器就會去選取這個表格中第一個數字,當再需要另一個亂數,亂數產生器就會去 選取這個表格中第二個數字,以此類推,所以當使用種子和分佈相同時,得到的亂數會相同,若不同時,得到的亂數會不同。而在NS2中,若是種子的值為0的話,則表示每次執行程式的時候,亂數產生器都會在產生出不同的表格,也就是說每次得到的亂數都不相同。

       

[Creating Random Variable]

        若是我們要在NS2中產生一個亂數產生器,並把種子設定為2,則可以把下面的程式碼放入tcl code中。

set rng [new RNG]

$rng seed 2

       random variable產生之後,接下來要決定分佈,我們可以使用的分佈有ParetoConstantUniformExponential、或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

 

可以看出當seed0ParetoUniformExponential所得到的結果會不相同。

 

 

[參考文件]

1. http://www-sop.inria.fr/mistral/personnel/Eitan.Altman/ns.htm

你可能感兴趣的:(TCL)