Random.lua 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. Random = {}
  2. local floor = math.floor
  3. local seed = 0
  4. local function random()
  5. local r = seed
  6. local m = 123459876
  7. if r < m then
  8. r, m = m, r
  9. end
  10. local res = 0
  11. local shift = 1
  12. local b
  13. while r ~= 0 do
  14. b = (r % 2 + m % 2) == 1 and 1 or 0
  15. res = shift * b + res
  16. shift = shift * 2
  17. r = floor( r * 0.5)
  18. m = floor( m * 0.5)
  19. end
  20. local k = floor(res / 127773)
  21. r = 16807 * (res - k * 127773) - 2836 * k
  22. if r < 0 then
  23. r = r + 2147483647
  24. end
  25. seed = r
  26. return r
  27. end
  28. function Random.SetSeed(sd)
  29. seed = sd
  30. end
  31. function Random.GetSeed()
  32. return seed
  33. end
  34. --随机0-1
  35. function Random.Range01()
  36. local var = random() / 2147483647
  37. BattleLogManager.Log(
  38. "random",
  39. "seed", seed)
  40. return var
  41. end
  42. --随机v1-v2
  43. function Random.Range(v1, v2)
  44. if v2 > v1 then
  45. return Random.Range01()*(v2-v1)+v1
  46. elseif v1 > v2 then
  47. return Random.Range01()*(v1-v2)+v2
  48. else
  49. return v1
  50. end
  51. end
  52. --随机v1-v2 返回整数
  53. function Random.RangeInt(v1, v2)
  54. if v2 > v1 then
  55. return floor(Random.Range01()*(v2-v1) + 0.5)+v1
  56. elseif v1 > v2 then
  57. return floor(Random.Range01()*(v1-v2) + 0.5)+v2
  58. else
  59. return v1
  60. end
  61. end
  62. function Random.RandomList(arr)
  63. if not arr or #arr <= 1 then
  64. return
  65. end
  66. local index
  67. for i = #arr, 1, -1 do
  68. index = Random.RangeInt(1, i)
  69. arr[i], arr[index] = arr[index], arr[i]
  70. end
  71. end