Index: test/cctest/cctest.h |
diff --git a/test/cctest/cctest.h b/test/cctest/cctest.h |
index 193126a0818e91a1aac21a900c0b0db476c7467d..1282d7da0f8c9d90a7faa4375188035d3595fe35 100644 |
--- a/test/cctest/cctest.h |
+++ b/test/cctest/cctest.h |
@@ -300,4 +300,57 @@ static inline void SimulateFullSpace(v8::internal::PagedSpace* space) { |
} |
+// Adapted from http://en.wikipedia.org/wiki/Multiply-with-carry |
+class RandomNumberGenerator { |
+ public: |
+ RandomNumberGenerator() { |
+ init(); |
+ } |
+ |
+ void init(uint32_t seed = 0x5688c73e) { |
+ static const uint32_t phi = 0x9e3779b9; |
+ c = 362436; |
+ i = kQSize-1; |
+ Q[0] = seed; |
+ Q[1] = seed + phi; |
+ Q[2] = seed + phi + phi; |
+ for (unsigned j = 3; j < kQSize; j++) { |
+ Q[j] = Q[j - 3] ^ Q[j - 2] ^ phi ^ j; |
+ } |
+ } |
+ |
+ uint32_t next() { |
+ uint64_t a = 18782; |
+ uint32_t r = 0xfffffffe; |
+ i = (i + 1) & (kQSize-1); |
+ uint64_t t = a * Q[i] + c; |
+ c = (t >> 32); |
+ uint32_t x = static_cast<uint32_t>(t + c); |
+ if (x < c) { |
+ x++; |
+ c++; |
+ } |
+ return (Q[i] = r - x); |
+ } |
+ |
+ uint32_t next(int max) { |
+ return next() % max; |
+ } |
+ |
+ bool next(double threshold) { |
+ ASSERT(threshold >= 0.0 && threshold <= 1.0); |
+ if (threshold == 1.0) return true; |
+ if (threshold == 0.0) return false; |
+ uint32_t value = next() % 100000; |
+ return threshold > static_cast<double>(value)/100000.0; |
+ } |
+ |
+ private: |
+ static const uint32_t kQSize = 4096; |
+ uint32_t Q[kQSize]; |
+ uint32_t c; |
+ uint32_t i; |
+}; |
+ |
+ |
#endif // ifndef CCTEST_H_ |