回答編集履歴

4

Qiita

2015/02/13 02:56

投稿

mpyw
mpyw

スコア5223

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
- if (mt_rand() / $max < $num / $count) {
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

2015/02/13 02:56

投稿

mpyw
mpyw

スコア5223

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

強調

2015/02/13 00:06

投稿

mpyw
mpyw

スコア5223

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

補足

2015/02/12 23:21

投稿

mpyw
mpyw

スコア5223

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