ns-random.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:4k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1996-1997 Regents of the University of California.
  3. # All rights reserved.
  4. # Redistribution and use in source and binary forms, with or without
  5. # modification, are permitted provided that the following conditions
  6. # are met:
  7. # 1. Redistributions of source code must retain the above copyright
  8. #    notice, this list of conditions and the following disclaimer.
  9. # 2. Redistributions in binary form must reproduce the above copyright
  10. #    notice, this list of conditions and the following disclaimer in the
  11. #    documentation and/or other materials provided with the distribution.
  12. # 3. All advertising materials mentioning features or use of this software
  13. #    must display the following acknowledgement:
  14. #  This product includes software developed by the MASH Research
  15. #  Group at the University of California Berkeley.
  16. # 4. Neither the name of the University nor of the Research Group may be
  17. #    used to endorse or promote products derived from this software without
  18. #    specific prior written permission.
  19. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  20. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  23. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  25. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  26. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  28. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  29. # SUCH DAMAGE.
  30. #
  31. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/lib/ns-random.tcl,v 1.14 1999/10/09 01:06:41 haoboy Exp $
  32. #
  33. #Code to generate random numbers here
  34. proc exponential {args} {
  35. global defaultRNG
  36. eval [list $defaultRNG exponential] $args
  37. }
  38. proc uniform {args} {
  39. global defaultRNG
  40. eval [list $defaultRNG uniform] $args
  41. }
  42. proc integer {args} {
  43. global defaultRNG
  44. eval [list $defaultRNG integer] $args
  45. }
  46. RNG instproc init {} {
  47.         $self next
  48.         #z2 used to create a normal distribution  from a uniform distribution
  49.         #using the polar method
  50.         $self instvar z2
  51.         set z2 0
  52. }
  53. RNG instproc uniform {a b} {
  54. expr $a + (($b - $a) * ([$self next-random] * 1.0 / 0x7fffffff))
  55. }
  56. RNG instproc integer k {
  57. expr [$self next-random] % abs($k)
  58. }
  59. RNG instproc exponential {{mu 1.0}} {
  60. expr - $mu * log(([$self next-random] + 1.0) / (0x7fffffff + 1.0))
  61. }
  62. #RNG instproc normal {a1 a2 } {
  63. #        $self instvar z2
  64. #        if {$z2 !=0 } {
  65. #                set z1 $z2
  66. #                set z2 0
  67. #        } else {
  68. #                set w 1
  69. #                while { $w >= 1.0 } {
  70. #                        set v1 [expr 2.0 * ([$self next-random] *1.0/0x7fffffff) - 1.0]
  71. #                        set v2 [expr 2.0 * ([$self next-random] *1.0/0x7fffffff) - 1.0]
  72. #                        set w  [expr ($v1*$v1+$v2*$v2)]
  73. #                }
  74. #                set w [expr  sqrt((-2.0*log($w))/$w)]
  75. #                set z1 [expr $v1*$w]
  76. #                set z2 [expr $v2*$w]
  77. #        }
  78. #        expr $a1 + $z1 *$a2
  79. #}
  80. #RNG instproc lognormal {med stddev } {
  81. #        expr $med *exp($stddev*[$self normal 0.0 1.0])
  82. #}
  83. RandomVariable instproc test count {
  84. for {set i 0} {$i < $count} {incr i} {
  85. puts stdout [$self value]
  86. }
  87. }
  88. set defaultRNG [new RNG]
  89. $defaultRNG seed 1
  90. $defaultRNG default
  91. #
  92. # Because defaultRNG is not a bound variable but is instead
  93. # just copied into C++, we enforce this.
  94. # (A long-term solution be to make defaultRNG bound.)
  95. # --johnh, 30-Dec-97
  96. #
  97. trace variable defaultRNG w { abort "cannot update defaultRNG once assigned"; }
  98. # Trace driven random variable.
  99. # Polly Huang, March 4 1999
  100. Class RandomVariable/TraceDriven -superclass RandomVariable
  101. RandomVariable/TraceDriven instproc init {} {
  102.     $self instvar filename_ file_
  103. }
  104. RandomVariable/TraceDriven instproc value {} {
  105.     $self instvar file_ filename_
  106.     if ![info exist file_] {
  107.         if [info exist filename_] {
  108.             set file_ [open $filename_ r]
  109.         } else {
  110.             puts "RandomVariable/TraceDriven: Filename is not given"
  111.             exit 0
  112.         }
  113.     }
  114.     if ![eof $file_] {
  115.         gets $file_ tmp
  116.         return $tmp
  117.     } else {
  118.         close $file_
  119.         puts "Error: RandomVariable/TraceDriven: Reached the end of the trace fi
  120. le "
  121.         exit 0
  122.     }
  123. }