質問編集履歴

2

現状のコードを追記

2016/03/18 11:42

投稿

luckyclock
luckyclock

スコア74

test CHANGED
File without changes
test CHANGED
@@ -7,3 +7,109 @@
7
7
  実際はリスト全部シャッフルする必要はなく、ランダムで重複しないリストの要素30個程度が取り出せればいいのですが、処理速度を短くしようとした場合いいやり方が思いつきません。
8
8
 
9
9
  いいやり方はないでしょうか?
10
+
11
+
12
+
13
+ 現在下記のようなコードでシャッフルしていますが、これだとbufnumが大きくなるほどループ数が大きくなり、
14
+
15
+ さらにbufnumが大きいほどshuffle回数も大きくしないとランダムになりません。
16
+
17
+
18
+
19
+ ```java
20
+
21
+ public class Shuffle {
22
+
23
+
24
+
25
+ public int bufnum; //用意するバッファ数(シャッフルする対象数)
26
+
27
+ public int[] tor; //シャッフル後の数値
28
+
29
+ int shuffleNum = 0; //シャッフル回数
30
+
31
+
32
+
33
+ public Shuffle()
34
+
35
+ {
36
+
37
+ }
38
+
39
+
40
+
41
+ public Shuffle(int num, int snum)
42
+
43
+ {
44
+
45
+ bufnum = num;
46
+
47
+ tor = new int[num];
48
+
49
+ shuffleNum = snum;
50
+
51
+ }
52
+
53
+
54
+
55
+ public void ShuffleNumber(){
56
+
57
+ int buff;
58
+
59
+ int ran1;
60
+
61
+ int ran2;
62
+
63
+
64
+
65
+ if(bufnum == 0)
66
+
67
+ return;
68
+
69
+
70
+
71
+ Random rnd1 = new Random();
72
+
73
+ Random rnd2 = new Random();
74
+
75
+
76
+
77
+ //数字を配置
78
+
79
+ for(int i = 1; i <= bufnum; i++){
80
+
81
+ tor[i - 1] = i - 1;
82
+
83
+ }
84
+
85
+
86
+
87
+ //シャッフル
88
+
89
+ for(int i = 1;i <= shuffleNum;i++){
90
+
91
+
92
+
93
+ //乱数を作成
94
+
95
+ ran1 = rnd1.nextInt(bufnum);
96
+
97
+ ran2 = rnd2.nextInt(bufnum);
98
+
99
+
100
+
101
+ //配列の入れ替え(乱数1と乱数2を入れ替え)
102
+
103
+ buff = tor[ran1];
104
+
105
+ tor[ran1] = tor[ran2];
106
+
107
+ tor[ran2] = buff;
108
+
109
+ }
110
+
111
+ }
112
+
113
+ }
114
+
115
+ ```

1

タイトルの修正

2016/03/18 11:42

投稿

luckyclock
luckyclock

スコア74

test CHANGED
@@ -1 +1 @@
1
- 重複しない乱数の発生方法Collections.shuffleの処理速度
1
+ 重複しない乱数の発生方法Collections.shuffleの処理速度
test CHANGED
File without changes