rand.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. //go:build go1.19
  2. package yu_rand
  3. import (
  4. _ "unsafe"
  5. )
  6. //go:linkname Uint32 runtime.fastrand
  7. //go:nosplit
  8. func Uint32() uint32
  9. //go:linkname Uint64 runtime.fastrand64
  10. //go:nosplit
  11. func Uint64() uint64
  12. //go:linkname Uint runtime.fastrandu
  13. //go:nosplit
  14. func Uint() uint
  15. // Int31
  16. //
  17. // @Description: 返回一个非负伪随机 31 位整数
  18. func Int31() int32 {
  19. return int32(Uint32() & (1<<31 - 1))
  20. }
  21. // Int63
  22. //
  23. // @Description: 返回一个非负伪随机 63 位整数
  24. func Int63() int64 {
  25. return int64(Uint64() & (1<<63 - 1))
  26. }
  27. // Uint31
  28. //
  29. // @Description: 返回一个非负伪随机 31 位整数
  30. func Uint31() uint32 {
  31. return Uint32() & (1<<31 - 1)
  32. }
  33. // Uint63
  34. //
  35. // @Description: 返回一个非负伪随机 63 位整数
  36. func Uint63() uint64 {
  37. return Uint64() & (1<<63 - 1)
  38. }
  39. // Int31n
  40. //
  41. // @Description: 函数返回一个在[0,n)范围内的伪随机int32值。
  42. func Int31n(n int32) int32 {
  43. if n <= 0 {
  44. panic("参数无效") // 如果n小于等于0,抛出异常
  45. }
  46. // if n&(n-1) == 0 { // 如果n是2的幂
  47. // return Int31() & (n - 1) // 返回一个随机数,并用n-1进行位与操作
  48. // }
  49. // j_max := int32((1 << 31) - 1 - (1<<31)%uint32(n)) // 计算最大可能的随机数
  50. // j_v := Int31() // 生成一个随机数
  51. // for j_v > j_max {
  52. // j_v = Int31() // 如果生成的随机数大于j_max,重新生成
  53. // }
  54. // return j_v % n // 返回随机数对n取余的结果
  55. return Int31() % n // 返回随机数对n取余的结果
  56. }
  57. // Int63n
  58. //
  59. // @Description: 函数返回一个在[0,n)范围内的伪随机int64值。
  60. func Int63n(n int64) int64 {
  61. if n <= 0 {
  62. panic("参数无效") // 如果n小于等于0,抛出异常
  63. }
  64. // if n&(n-1) == 0 { // 如果n是2的幂
  65. // return Int63() & (n - 1) // 返回一个随机数,并用n-1进行位与操作
  66. // }
  67. // j_max := int64((1 << 63) - 1 - (1<<63)%uint64(n)) // 计算最大可能的随机数
  68. // j_v := Int63() // 生成一个随机数
  69. // for j_v > j_max {
  70. // j_v = Int63() // 如果生成的随机数大于j_max,重新生成
  71. // }
  72. // return j_v % n // 返回随机数对n取余的结果
  73. return Int63() % n // 返回随机数对n取余的结果
  74. }
  75. // Uint31n
  76. //
  77. // @Description: 函数返回一个在[0,n)范围内的伪随机int32值。
  78. func Uint31n(n uint32) uint32 {
  79. if n <= 0 {
  80. panic("参数无效") // 如果n小于等于0,抛出异常
  81. }
  82. // if n&(n-1) == 0 { // 如果n是2的幂
  83. // return Int31() & (n - 1) // 返回一个随机数,并用n-1进行位与操作
  84. // }
  85. // j_max := int32((1 << 31) - 1 - (1<<31)%uint32(n)) // 计算最大可能的随机数
  86. // j_v := Int31() // 生成一个随机数
  87. // for j_v > j_max {
  88. // j_v = Int31() // 如果生成的随机数大于j_max,重新生成
  89. // }
  90. // return j_v % n // 返回随机数对n取余的结果
  91. return Uint31() % n // 返回随机数对n取余的结果
  92. }
  93. // Uint63n
  94. //
  95. // @Description: 函数返回一个在[0,n)范围内的伪随机int64值。
  96. func Uint63n(n uint64) uint64 {
  97. if n <= 0 {
  98. panic("参数无效") // 如果n小于等于0,抛出异常
  99. }
  100. // if n&(n-1) == 0 { // 如果n是2的幂
  101. // return Int63() & (n - 1) // 返回一个随机数,并用n-1进行位与操作
  102. // }
  103. // j_max := int64((1 << 63) - 1 - (1<<63)%uint64(n)) // 计算最大可能的随机数
  104. // j_v := Int63() // 生成一个随机数
  105. // for j_v > j_max {
  106. // j_v = Int63() // 如果生成的随机数大于j_max,重新生成
  107. // }
  108. // return j_v % n // 返回随机数对n取余的结果
  109. return Uint63() % n // 返回随机数对n取余的结果
  110. }
  111. // Int31MinMax
  112. //
  113. // @Description: 函数返回一个在[min, max]范围内的随机整数。如果min大于max,函数会抛出一个panic。
  114. func Int31MinMax(min, max int32) int32 {
  115. if min > max {
  116. panic("min必须小于或等于max")
  117. }
  118. return min + Int31n(max-min+1)
  119. }
  120. // Int63MinMax
  121. //
  122. // @Description: 函数返回一个在[min, max]范围内的随机整数。如果min大于max,函数会抛出一个panic。
  123. func Int63MinMax(min, max int64) int64 {
  124. if min > max {
  125. panic("min必须小于或等于max")
  126. }
  127. return min + Int63n(max-min+1)
  128. }
  129. // Uint31MinMax
  130. //
  131. // @Description: 函数返回一个在[min, max]范围内的随机整数。如果min大于max,函数会抛出一个panic。
  132. func Uint31MinMax(min, max uint32) uint32 {
  133. if min > max {
  134. panic("min必须小于或等于max")
  135. }
  136. return min + Uint31n(max-min+1)
  137. }
  138. // Uint63MinMax
  139. //
  140. // @Description: 函数返回一个在[min, max]范围内的随机整数。如果min大于max,函数会抛出一个panic。
  141. func Uint63MinMax(min, max uint64) uint64 {
  142. if min > max {
  143. panic("min必须小于或等于max")
  144. }
  145. return min + Uint63n(max-min+1)
  146. }
  147. // IntMinMax
  148. //
  149. // @Description: 函数返回一个在[min, max]范围内的随机整数。如果min大于max,函数会抛出一个panic。
  150. func IntMinMax(min, max int) int {
  151. if min > max {
  152. panic("min必须小于或等于max")
  153. }
  154. return min + Intn(max-min+1)
  155. }
  156. type rand struct{}
  157. func (r rand) Read(p []byte) (n int, err error) {
  158. for j_i := 0; j_i < len(p); j_i++ {
  159. p[j_i] = byte(Uint32())
  160. }
  161. return len(p), nil
  162. }
  163. func (r rand) ReadEx(p []byte, ex []byte) (n int, err error) {
  164. for j_i := 0; j_i < len(p); j_i++ {
  165. p[j_i] = ex[Intn(len(ex))]
  166. }
  167. return len(p), nil
  168. }
  169. var Rand rand