質問編集履歴

3

コードの追加

2020/09/16 12:24

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -28,13 +28,147 @@
28
28
 
29
29
 
30
30
 
31
+ ```js
32
+
33
+ // *** 偏り *** //
34
+
35
+ let table = {
36
+
37
+ "A": 80.0,
38
+
39
+ "B": 19.5,
40
+
41
+ "C": 0.5
42
+
43
+ };
44
+
45
+
46
+
47
+ // *** 手順➀ *** //
48
+
49
+ while (true) {
50
+
51
+ let ok = true;
52
+
53
+ for (let key in table) {
54
+
55
+ if (!Number.isInteger(table[key])) {
56
+
57
+ ok = false;
58
+
59
+ break;
60
+
61
+ }
62
+
63
+ }
64
+
65
+ if (ok) {
66
+
67
+ break;
68
+
69
+ }
70
+
71
+ for (let key in table) {
72
+
73
+ table[key] *= 10;
74
+
75
+ }
76
+
77
+ }
78
+
79
+
80
+
81
+ // *** 手順➁ *** //
82
+
83
+ function GCD(array) {
84
+
85
+ function call(a, b) {
86
+
87
+ return (b ? call(b, a % b) : a);
88
+
89
+ }
90
+
91
+ let ans = array[0];
92
+
93
+ for (let i = 1; i < array.length; i++) {
94
+
95
+ ans = call(ans, array[i]);
96
+
97
+ }
98
+
99
+ return ans;
100
+
101
+ }
102
+
103
+ let div = GCD(Object.values(table));
104
+
105
+ for (let key in table) {
106
+
107
+ table[key] /= div;
108
+
109
+ }
110
+
111
+
112
+
113
+ // *** 手順➂ *** //
114
+
115
+ let output = new Array();
116
+
117
+ for (let key in table) {
118
+
119
+ let amount = table[key];
120
+
121
+ for (let i = 0; i < amount; i++) {
122
+
123
+ output.push(key);
124
+
125
+ }
126
+
127
+ }
128
+
129
+
130
+
131
+ // *** テスト *** //
132
+
133
+ let items = {};
134
+
135
+ for (let i = 0; i < 1000; i++) {
136
+
137
+
138
+
139
+ // *** 手順➃ *** //
140
+
141
+ let key = output[Math.floor(Math.random() * output.length)];
142
+
143
+
144
+
145
+ // *** カウント *** //
146
+
147
+ if (!items.hasOwnProperty(key)) {
148
+
149
+ items[key] = 0;
150
+
151
+ }
152
+
153
+ items[key]++;
154
+
155
+
156
+
157
+ }
158
+
159
+ console.log(items);
160
+
161
+ ```
162
+
31
163
  ※ [ここのページ](http://cly7796.net/wp/javascript/make-random-bias/)を参考にいろいろと改良しました。
32
164
 
33
165
 
34
166
 
35
- ただし、このやり方では超低確率での偏りランダムを行う際、
167
+ ### 問題点
36
168
 
169
+ このやり方では超低確率での偏りランダムを行う際、➂の手順で大量のデータを入れる必要があります。
170
+
37
- ➂の手順で大量のデータを入れる必要があるので、メモリ不足などのパフォーマンスに影響を及ぼします。
171
+ 環境によってはメモリ不足などのパフォーマンスに影響を及ぼします。
38
172
 
39
173
  その為、著しく低い確率の偏りランダムを行うのは不向きです。
40
174
 

2

手順➃の付け忘れ

2020/09/16 12:24

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -22,6 +22,10 @@
22
22
 
23
23
  >  配列の中身は `['A', 'A', 'A', 'A', ... 'A', 'B', 'B', 'B', 'B', ... 'B', 'C']` のようになります。
24
24
 
25
+ > ➃ **偏りランダムを行います**
26
+
27
+ >  `配列[Math.floor(Math.random() * 配列.length)]` で取得します。
28
+
25
29
 
26
30
 
27
31
  ※ [ここのページ](http://cly7796.net/wp/javascript/make-random-bias/)を参考にいろいろと改良しました。

1

タグの更新

2020/09/16 12:03

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
File without changes