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

質問編集履歴

2

現状のコードを追記

2016/03/18 11:42

投稿

luckyclock
luckyclock

スコア74

title CHANGED
File without changes
body CHANGED
@@ -2,4 +2,57 @@
2
2
  Collections.shuffle
3
3
  というメソッドがありますが、かなり大量のリスト(1000以上)をシャッフルするとなるとやはり処理時間がかかるでしょうか?
4
4
  実際はリスト全部シャッフルする必要はなく、ランダムで重複しないリストの要素30個程度が取り出せればいいのですが、処理速度を短くしようとした場合いいやり方が思いつきません。
5
- いいやり方はないでしょうか?
5
+ いいやり方はないでしょうか?
6
+
7
+ 現在下記のようなコードでシャッフルしていますが、これだとbufnumが大きくなるほどループ数が大きくなり、
8
+ さらにbufnumが大きいほどshuffle回数も大きくしないとランダムになりません。
9
+
10
+ ```java
11
+ public class Shuffle {
12
+
13
+ public int bufnum; //用意するバッファ数(シャッフルする対象数)
14
+ public int[] tor; //シャッフル後の数値
15
+ int shuffleNum = 0; //シャッフル回数
16
+
17
+ public Shuffle()
18
+ {
19
+ }
20
+
21
+ public Shuffle(int num, int snum)
22
+ {
23
+ bufnum = num;
24
+ tor = new int[num];
25
+ shuffleNum = snum;
26
+ }
27
+
28
+ public void ShuffleNumber(){
29
+ int buff;
30
+ int ran1;
31
+ int ran2;
32
+
33
+ if(bufnum == 0)
34
+ return;
35
+
36
+ Random rnd1 = new Random();
37
+ Random rnd2 = new Random();
38
+
39
+ //数字を配置
40
+ for(int i = 1; i <= bufnum; i++){
41
+ tor[i - 1] = i - 1;
42
+ }
43
+
44
+ //シャッフル
45
+ for(int i = 1;i <= shuffleNum;i++){
46
+
47
+ //乱数を作成
48
+ ran1 = rnd1.nextInt(bufnum);
49
+ ran2 = rnd2.nextInt(bufnum);
50
+
51
+ //配列の入れ替え(乱数1と乱数2を入れ替え)
52
+ buff = tor[ran1];
53
+ tor[ran1] = tor[ran2];
54
+ tor[ran2] = buff;
55
+ }
56
+ }
57
+ }
58
+ ```

1

タイトルの修正

2016/03/18 11:42

投稿

luckyclock
luckyclock

スコア74

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