Ноль или единица с вероятностью 3/4 и 1/4
Просто нужны были равномерно распределённые случайные числа с вероятностью нуля в 75%, а единицы - в 25%, в максимально компактной и подходящей для аппаратных решений реализации.
Думаю, ничего короче побитовых операций тут всё равно не придумать, пусть будет хоть так.
Любопытно, что старая добрая тернарная операция отлично работает слева от инкрементов-декрементов.
Исходник выполнялся в консоли Visual Studio 2019.
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; int rnd50pct() { //0 или 1 с равной вероятностью return rand() & 1; //Чёт-нечёт побитово } bool rnd75pct() { return rnd50pct() | rnd50pct(); //Побитовое "или" даст нужную вероятность "единицы" в 1/4 } int main() { srand(time(NULL)); int nPlus=0, nMinus=0; for (int i = 0; i < 10000; i++) { bool n = rnd75pct(); (n ? nPlus : nMinus)++; cout << n; } cout << endl << "0: " << nMinus << ", 1:" << nPlus; return 0; }
06.06.2020, 22:05 [1017 просмотров]