• ベストアンサー

重複しない乱数の発生のしかた

はじめまして。10名の社員がランチタイムに5名ずつ、早番と遅番に分かれてお昼にいっています。その割り振りをランダムに決めてくれるプログラムを作りたいのですが、(毎日組み合わせを変える)どのようにすればいいでしょうか?お知恵を拝借したいと思います。どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • omni2
  • ベストアンサー率53% (33/62)
回答No.7

私も勉強がてらにchizudaraさんの書きこみソースを改造してつくってみました。 shuffleは非常に便利ですね。私もとても参考になりました。ありがとうございました。 import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; public class lunch { public static void main(String[]args){ String[] str = { "1","2","3","4","5","6","7","8","9","10","11","12","13","14","15"}; int len = str.length; List list = Arrays.asList(str); Collections.shuffle(list); System.out.println("今日のランチは"); printList(list,len); } private static void printList(List list,int len){ int i = 0; int roop = len / 2; if(list != null){ Iterator itr = list.iterator(); itr.hasNext(); System.out.print("早番は: "); System.out.print("["); for(i = 0;i < roop;i++){ System.out.print(itr.next() + " "); } System.out.println("]"); System.out.print("遅番は: "); System.out.print("["); while(itr.hasNext()){ System.out.print(itr.next() + " "); } System.out.println("]"); System.out.println(" "); } } }

chizudara
質問者

お礼

これこそ私が求めていたプログラムです!本当にありがとうございました。大変勉強になりました。

その他の回答 (6)

  • tachiwa
  • ベストアンサー率34% (25/73)
回答No.6

以下のURLのANo#2が私のやり方です。参考にしてください。 http://security.okweb.jp/kotaeru.php3?qid=1188782

参考URL:
http://security.okweb.jp/kotaeru.php3?qid=1188782
chizudara
質問者

お礼

私にはちょっと難しかったですが、こういう方法もあるのだと大変勉強になりました。どうもありがとうございました。

  • unibon
  • ベストアンサー率47% (160/340)
回答No.5

重複しない乱数を発生させるのとはちょっと違いますが、混ぜる機能として、Collections クラスの shuffle メソッドがあります。 社員番号を入れた List を与えれば、shuffle メソッドが乱数(Random クラス)を使って混ぜてくれますので、その結果を、前半5人と後半5人に分ければよいでしょう。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Collections.html#shuffle(java.util.List,%20java.util.Random)
chizudara
質問者

お礼

ありがとうございます!shuffleでいろいろと検索してみたところ、参考になる以下のソースが見つかりました。できれば「早番は:○○、××」「遅番は:△△、□□」とわけて表示したかったのですが、がんばって探して見ます。 import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; public class lunch { public static void main(String[] args) { String[] str = { "A", "B", "C", "D", "E", "F", "G", "H" }; List list = Arrays.asList(str); Collections.shuffle(list); System.out.println("今日のランチは"); printList(list); } private static void printList(List list) { if (list != null) { System.out.print("\t["); Iterator itr = list.iterator(); while (itr.hasNext()) { System.out.print(itr.next() + " "); } System.out.println("]"); System.out.println(""); } } }

  • omni2
  • ベストアンサー率53% (33/62)
回答No.4

私もJava初心者なので、参考にならないかとおもいますが、本を参考にかきます。 ランダムな数は次のようにしてつくるみたいです。 Random1.javaというファイル名にしてください。 class Random1{  public static void main(String args[]){   //0~9までの乱数を作成する   Random ran = new Random();   System.out.println(ran.nextInt(10));   System.out.println(ran.nextInt(10));   System.out.println(ran.nextInt(10));  } } 重複する値も出ますので、実際のプログラムはその辺を考慮して組まないといけないとおもいます。

chizudara
質問者

お礼

まだ完成できていませんが、大変参考になりました。ありがとうございました!

  • TREX555
  • ベストアンサー率16% (61/367)
回答No.3

10曲入っている音楽CDをランダム再生モードにします。 表示された曲順の前半を早番、後半を遅番に分ければ OKです。 プログラムなんて面倒なことを考える必要はありません。

chizudara
質問者

お礼

アドバイスありがとうございます!確かにそのとおりですね・・・でも、勉強のためにJavaでプログラムを組んでみたかったのです。こういう考え方もあるんだなーと大変参考になりました。ありがとうございました。

回答No.2

私だったら、次のようにします。 VB っぽい書き方です。 ' まず全員を早番に初期化 For i = 0 to 9 社員(i) = 早番 Next For i = 0 to 4  ' すでに遅番になっている人をスキップする乱数を発生  Do   j = (0~9の乱数)  While 社員(j) <> 遅番  ' 与えられた乱数の社員を遅番にする。  社員(j) = 遅番 Next もうちょっと規模が大きい場合(千人以上?)は、リストを作って遅番になった人からリストから抜いて乱数の最大値を減らしていく方法がよいと思います。

chizudara
質問者

お礼

早速のお返事ありがとうございます!ただ、私はプログラムを勉強し始めたばかりで、Javaの基礎ぐらいしか勉強しておらず、私が力不足のためよくわかりませんでした・・・せっかくお答えいただいたのに申し訳ありません。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

普通にRandomクラスではダメでしか? できればそれの何がダメなのかを詳しく教えてもらえたら良い回答が得られるかも。

chizudara
質問者

お礼

早速のアドバイスありがとうございます!恥ずかしながらRandomクラスを使ったことがないため、具体的なアドバイスをいただければ助かります。どうぞよろしくお願いいたします。