teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

コードの追加

2020/09/16 12:24

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -13,10 +13,77 @@
13
13
  > ➃ **偏りランダムを行います**
14
14
  >  `配列[Math.floor(Math.random() * 配列.length)]` で取得します。
15
15
 
16
+ ```js
17
+ // *** 偏り *** //
18
+ let table = {
19
+ "A": 80.0,
20
+ "B": 19.5,
21
+ "C": 0.5
22
+ };
23
+
24
+ // *** 手順➀ *** //
25
+ while (true) {
26
+ let ok = true;
27
+ for (let key in table) {
28
+ if (!Number.isInteger(table[key])) {
29
+ ok = false;
30
+ break;
31
+ }
32
+ }
33
+ if (ok) {
34
+ break;
35
+ }
36
+ for (let key in table) {
37
+ table[key] *= 10;
38
+ }
39
+ }
40
+
41
+ // *** 手順➁ *** //
42
+ function GCD(array) {
43
+ function call(a, b) {
44
+ return (b ? call(b, a % b) : a);
45
+ }
46
+ let ans = array[0];
47
+ for (let i = 1; i < array.length; i++) {
48
+ ans = call(ans, array[i]);
49
+ }
50
+ return ans;
51
+ }
52
+ let div = GCD(Object.values(table));
53
+ for (let key in table) {
54
+ table[key] /= div;
55
+ }
56
+
57
+ // *** 手順➂ *** //
58
+ let output = new Array();
59
+ for (let key in table) {
60
+ let amount = table[key];
61
+ for (let i = 0; i < amount; i++) {
62
+ output.push(key);
63
+ }
64
+ }
65
+
66
+ // *** テスト *** //
67
+ let items = {};
68
+ for (let i = 0; i < 1000; i++) {
69
+
70
+ // *** 手順➃ *** //
71
+ let key = output[Math.floor(Math.random() * output.length)];
72
+
73
+ // *** カウント *** //
74
+ if (!items.hasOwnProperty(key)) {
75
+ items[key] = 0;
76
+ }
77
+ items[key]++;
78
+
79
+ }
80
+ console.log(items);
81
+ ```
16
82
  ※ [ここのページ](http://cly7796.net/wp/javascript/make-random-bias/)を参考にいろいろと改良しました。
17
83
 
84
+ ### 問題点
18
- ただし、このやり方では超低確率での偏りランダムを行う際、
85
+ このやり方では超低確率での偏りランダムを行う際、➂の手順で大量のデータを入れる必要があります。
19
- ➂の手順で大量のデータを入れる必要があるので、メモリ不足などのパフォーマンスに影響を及ぼします。
86
+ 環境によってはメモリ不足などのパフォーマンスに影響を及ぼします。
20
87
  その為、著しく低い確率の偏りランダムを行うのは不向きです。
21
88
  ループを使わずにパフォーマンスも安定している偏りランダムを行う方法についてご教授ください。
22
89
  よろしくお願いします。

2

手順➃の付け忘れ

2020/09/16 12:24

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -10,6 +10,8 @@
10
10
  > ➂ **➁で求めた各データの値分を配列に代入します**
11
11
  >  Aは`160`なので配列に**A**を`160`個代入。**B**は`39`個代入。**C**は`1`個代入。
12
12
  >  配列の中身は `['A', 'A', 'A', 'A', ... 'A', 'B', 'B', 'B', 'B', ... 'B', 'C']` のようになります。
13
+ > ➃ **偏りランダムを行います**
14
+ >  `配列[Math.floor(Math.random() * 配列.length)]` で取得します。
13
15
 
14
16
  ※ [ここのページ](http://cly7796.net/wp/javascript/make-random-bias/)を参考にいろいろと改良しました。
15
17
 

1

タグの更新

2020/09/16 12:03

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
File without changes