N種のカードをガチャする。どのカードを引くかはどれも同確率。
N種のカードをコンプするには何回ガチャすることになるんだろ。
やってみた:
#include <iostream>
#include <random>
#include <set>
#include <map>
#include <string>
using namespace std;
int main() {
const int N = 10; // カード数
const int trials = 1000; // 試行回数
mt19937 engine; // メルセンヌ・ツイスター
uniform_int_distribution<int> dist(0,N-1); // 0..N-1 一様分布
auto gacha = [&]() { return dist(engine); }; // 0..N-1 一様乱数
set<int> items; // 入手したカード種
map<int,int> hist; // 度数分布表
int max_trials = 0;
for ( int i = 0; i < trials; ++i ) {
int draws = 0;
items.clear();
// コンプするまでガチャを繰り返し、
// ガチャ数を度数分布表に累積する
while ( items.size() != N ) {
++draws;
items.insert(gacha());
}
++hist[draws];
if ( max_trials < draws ) max_trials = draws;
}
// 度数分布を出力する
for ( int i = N; i <= max_trials; ++i ) {
cout << i << ':' << string(hist[i],'#') << endl;
}
}
実行結果はコチラ:
10:
11:
12:###
13:########
14:###############
15:############
16:##############
17:#############################
18:#######################################
19:#########################################
20:#########################################
21:##############################################
22:############################
23:######################################################
24:####################################
25:##############################################
26:##########################################
27:###########################################
28:##############################################
29:###########################################
30:################################
31:####################################
32:#####################################
33:##################
34:##########################
35:############################
36:####################
37:###################
38:###############
39:#############
40:####################
41:#################
42:##############
43:################
44:#############
45:#######
46:###########
47:########
...
N=10 のとき、23回あたりにピークがありますな。
一回100円としてコンプまでにおおむね2300円。
上の結果は途中で切ってるけど、7300円つぎ込んだバカがひとりいました。