10225501448 李度 10225101546 陈胤遒 10215501422 高宇菲
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

63 lignes
2.1 KiB

  1. // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file. See the AUTHORS file for names of contributors.
  4. #ifndef STORAGE_LEVELDB_UTIL_RANDOM_H_
  5. #define STORAGE_LEVELDB_UTIL_RANDOM_H_
  6. #include <cstdint>
  7. namespace leveldb {
  8. // A very simple random number generator. Not especially good at
  9. // generating truly random bits, but good enough for our needs in this
  10. // package.
  11. class Random {
  12. private:
  13. uint32_t seed_;
  14. public:
  15. explicit Random(uint32_t s) : seed_(s & 0x7fffffffu) {
  16. // Avoid bad seeds.
  17. if (seed_ == 0 || seed_ == 2147483647L) {
  18. seed_ = 1;
  19. }
  20. }
  21. uint32_t Next() {
  22. static const uint32_t M = 2147483647L; // 2^31-1
  23. static const uint64_t A = 16807; // bits 14, 8, 7, 5, 2, 1, 0
  24. // We are computing
  25. // seed_ = (seed_ * A) % M, where M = 2^31-1
  26. //
  27. // seed_ must not be zero or M, or else all subsequent computed values
  28. // will be zero or M respectively. For all other values, seed_ will end
  29. // up cycling through every number in [1,M-1]
  30. uint64_t product = seed_ * A;
  31. // Compute (product % M) using the fact that ((x << 31) % M) == x.
  32. seed_ = static_cast<uint32_t>((product >> 31) + (product & M));
  33. // The first reduction may overflow by 1 bit, so we may need to
  34. // repeat. mod == M is not possible; using > allows the faster
  35. // sign-bit-based test.
  36. if (seed_ > M) {
  37. seed_ -= M;
  38. }
  39. return seed_;
  40. }
  41. // Returns a uniformly distributed value in the range [0..n-1]
  42. // REQUIRES: n > 0
  43. uint32_t Uniform(int n) { return Next() % n; }
  44. // Randomly returns true ~"1/n" of the time, and false otherwise.
  45. // REQUIRES: n > 0
  46. bool OneIn(int n) { return (Next() % n) == 0; }
  47. // Skewed: pick "base" uniformly from range [0,max_log] and then
  48. // return "base" random bits. The effect is to pick a number in the
  49. // range [0,2^max_log-1] with exponential bias towards smaller numbers.
  50. uint32_t Skewed(int max_log) { return Uniform(1 << Uniform(max_log + 1)); }
  51. };
  52. } // namespace leveldb
  53. #endif // STORAGE_LEVELDB_UTIL_RANDOM_H_