/* * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree.
*/ #include"rtc_base/random.h"
uint32_t Random::Rand(uint32_t t) { // Casting the output to 32 bits will give an almost uniform number. // Pr[x=0] = (2^32-1) / (2^64-1) // Pr[x=k] = 2^32 / (2^64-1) for k!=0 // Uniform would be Pr[x=k] = 2^32 / 2^64 for all 32-bit integers k.
uint32_t x = NextOutput(); // If x / 2^32 is uniform on [0,1), then x / 2^32 * (t+1) is uniform on // the interval [0,t+1), so the integer part is uniform on [0,t].
uint64_t result = x * (static_cast<uint64_t>(t) + 1);
result >>= 32; return result;
}
double Random::Gaussian(double mean, double standard_deviation) { // Creating a Normal distribution variable from two independent uniform // variables based on the Box-Muller transform, which is defined on the // interval (0, 1]. Note that we rely on NextOutput to generate integers // in the range [1, 2^64-1]. Normally this behavior is a bit frustrating, // but here it is exactly what we need. constdouble kPi = 3.14159265358979323846; double u1 = static_cast<double>(NextOutput()) / static_cast<double>(0xFFFFFFFFFFFFFFFFull); double u2 = static_cast<double>(NextOutput()) / static_cast<double>(0xFFFFFFFFFFFFFFFFull); return mean + standard_deviation * sqrt(-2 * log(u1)) * cos(2 * kPi * u2);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.