mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-12-24 23:44:56 +03:00
27dd121d14
git-subtree-dir: outside/re2 git-subtree-mainline: f94738bfd171ae447133e0964843addbb497894f git-subtree-split: 539b44fc4c5a49c3453b80e3af85d297f4cab4bf
35 lines
776 B
C++
35 lines
776 B
C++
// Copyright 2005-2009 The RE2 Authors. All Rights Reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Modified from Google perftools's tcmalloc_unittest.cc.
|
|
|
|
#include "util/random.h"
|
|
|
|
namespace re2 {
|
|
|
|
int32 ACMRandom::Next() {
|
|
const int32 M = 2147483647L; // 2^31-1
|
|
const int32 A = 16807;
|
|
// In effect, we are computing seed_ = (seed_ * A) % M, where M = 2^31-1
|
|
uint32 lo = A * (int32)(seed_ & 0xFFFF);
|
|
uint32 hi = A * (int32)((uint32)seed_ >> 16);
|
|
lo += (hi & 0x7FFF) << 16;
|
|
if (lo > M) {
|
|
lo &= M;
|
|
++lo;
|
|
}
|
|
lo += hi >> 15;
|
|
if (lo > M) {
|
|
lo &= M;
|
|
++lo;
|
|
}
|
|
return (seed_ = (int32) lo);
|
|
}
|
|
|
|
int32 ACMRandom::Uniform(int32 n) {
|
|
return Next() % n;
|
|
}
|
|
|
|
} // namespace re2
|