回答編集履歴
4
Qiita
test
CHANGED
@@ -34,40 +34,4 @@
|
|
34
34
|
|
35
35
|
|
36
36
|
|
37
|
-
```lang-php
|
38
|
-
|
39
|
-
function mt_array_rand(array $array, $num = 1) {
|
40
|
-
|
41
|
-
$num = (int)$num;
|
42
|
-
|
43
|
-
$count = count($array);
|
44
|
-
|
45
|
-
if ($num <= 0 || $count < $num) {
|
46
|
-
|
47
|
-
return null;
|
48
|
-
|
49
|
-
}
|
50
|
-
|
51
|
-
$max = mt_getrandmax() + 1.0;
|
52
|
-
|
53
|
-
$retval = array();
|
54
|
-
|
55
|
-
foreach ($array as $key => $_) {
|
56
|
-
|
57
|
-
|
37
|
+
[Qiita - array_randやshuffleの乱択精度を改善しよう](http://qiita.com/mpyw/items/c644dab7d067626fc629)
|
58
|
-
|
59
|
-
$retval[] = $key;
|
60
|
-
|
61
|
-
--$num;
|
62
|
-
|
63
|
-
}
|
64
|
-
|
65
|
-
--$count;
|
66
|
-
|
67
|
-
}
|
68
|
-
|
69
|
-
return !isset($retval[1]) ? $retval[0] : $retval;
|
70
|
-
|
71
|
-
}
|
72
|
-
|
73
|
-
```
|
3
mt_array_rand
test
CHANGED
@@ -27,3 +27,47 @@
|
|
27
27
|
?>
|
28
28
|
|
29
29
|
```
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
事情あって`array_rand`の内部で`mt_rand`を使用したい場合は以下の実装を参考に。
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
```lang-php
|
38
|
+
|
39
|
+
function mt_array_rand(array $array, $num = 1) {
|
40
|
+
|
41
|
+
$num = (int)$num;
|
42
|
+
|
43
|
+
$count = count($array);
|
44
|
+
|
45
|
+
if ($num <= 0 || $count < $num) {
|
46
|
+
|
47
|
+
return null;
|
48
|
+
|
49
|
+
}
|
50
|
+
|
51
|
+
$max = mt_getrandmax() + 1.0;
|
52
|
+
|
53
|
+
$retval = array();
|
54
|
+
|
55
|
+
foreach ($array as $key => $_) {
|
56
|
+
|
57
|
+
if (mt_rand() / $max < $num / $count) {
|
58
|
+
|
59
|
+
$retval[] = $key;
|
60
|
+
|
61
|
+
--$num;
|
62
|
+
|
63
|
+
}
|
64
|
+
|
65
|
+
--$count;
|
66
|
+
|
67
|
+
}
|
68
|
+
|
69
|
+
return !isset($retval[1]) ? $retval[0] : $retval;
|
70
|
+
|
71
|
+
}
|
72
|
+
|
73
|
+
```
|
2
強調
test
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
[PHP Manual - mt_rand](http://php.net/manual/ja/function.mt-rand.php)
|
2
2
|
|
3
|
-
→ 指定した範囲内のランダムな整数値を得たいときに使う関数。`rand`よりも`mt_rand`の方が高性能なため、`rand`を使う必要はない。`rand`を使っている記事はたいてい古い情報。
|
3
|
+
→ 指定した**範囲**内のランダムな整数値を得たいときに使う関数。`rand`よりも`mt_rand`の方が高性能なため、`rand`を使う必要はない。`rand`を使っている記事はたいてい古い情報。
|
4
4
|
|
5
5
|
|
6
6
|
|
7
7
|
[PHP Manual - array_rand](http://www.php.net/manual/ja/function.array-rand.php)
|
8
8
|
|
9
|
-
→ 指定した配列の中からランダムな要素を得たいときに使う関数。但し内部では`mt_rand`ではなく`rand`を使用している。
|
9
|
+
→ 指定した**配列**の中からランダムな要素を得たいときに使う関数。但し内部では`mt_rand`ではなく`rand`を使用している。
|
10
10
|
|
11
11
|
|
12
12
|
|
1
補足
test
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
[PHP Manual - mt_rand](http://php.net/manual/ja/function.mt-rand.php)
|
2
|
+
|
3
|
+
→ 指定した範囲内のランダムな整数値を得たいときに使う関数。`rand`よりも`mt_rand`の方が高性能なため、`rand`を使う必要はない。`rand`を使っている記事はたいてい古い情報。
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
[PHP Manual - array_rand](http://www.php.net/manual/ja/function.array-rand.php)
|
8
|
+
|
9
|
+
→ 指定した配列の中からランダムな要素を得たいときに使う関数。但し内部では`mt_rand`ではなく`rand`を使用している。
|
10
|
+
|
11
|
+
|
12
|
+
|
1
13
|
```lang-php
|
2
14
|
|
3
15
|
<?php
|