БлогNot. Ноль или единица с вероятностью 3/4 и 1/4

Ноль или единица с вероятностью 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 просмотров]


теги: c++ random алгоритм

К этой статье пока нет комментариев, Ваш будет первым