2016-12-17 10 views
0

重複しないで配列を実行する乱数を作成する必要があります。重複のない乱数のリストを作成するにはどうすればよいですか?

問題は重複しており、java.util.Randomまたはjava.util.ArrayListのような入力(教師の指示)にはScanner以外のUtilsは使用できません。

教師が私たちに書いたrandomという関数を使用し、関数newNum(int num)は私が尋ねたものが必要な場所です - 乱数。

package exercise; 

import java.util.Scanner; 

public class Bingo { 

    static int size = 10; 
    static int num; 
    static int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    private static Scanner sc; 

    public static void main(String[] args) { 

     System.out.print("Press Enter to start: "); 
     sc = new Scanner(System.in); 
     sc.nextLine(); 
     System.out.println(""); 

     // int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
     // int[] tempArray = arr; 

     int num = random(); 
     // int num = sc.nextInt(); 

     // System.out.println(num); 

     while (size > 0) { 
      System.out.println(num); 
      size--; 
      newArray(num); 
      num = random(); 
      newNum(num); 
      // System.out.println(num); 
     } 

    } 

    public static int random() { 

     int max = 10; 
     double r = Math.random(); 
     int num = (int) (r * max + 1); 

     return num; 
    } 

    public static int newNum(int num) { 

     // Here should go the code for the function for getting only new 
     // random number without duplications 

     return num; 
    } 

    public static int newArray(int num) { 

     int[] tempArray = arr; 

     arr = new int[size]; 

     int x = num - 1; 
     for (int i = 0; i < x; i++) { 
      if (i < size) { 
       arr[i] = tempArray[i]; 
      } 
     } 
     for (int i = num; i < size; i++) { 
      if (i < size) { 
       int y = i - 1; 
       arr[y] = tempArray[i]; 
      } else { 
       int a = size - 1; 
       arr[a] = tempArray[size]; 
      } 
     } 
     return num; 
    } 

} 
+5

スタックオーバーフローへようこそ。これは学校のプロジェクトなので、学習していることを確かめるためには、自分でそれを行うべきです。ここで質問をするためのいくつかのガイドラインもあります:http://stackoverflow.com/help/how-to-ask - 質問をする場合は、人々の手助けをしやすくする方法で行うことができます。私はあなたに割り当てのヒントを与えます:あなたが使用した番号を追跡し、新しい番号を生成するたびにそのリストを確認してください – Mikkel

+0

ヒントをありがとうが、私は明日まで私の先生にそれを送る必要があるより多くの説明、または後で自分自身のための迅速かつ説明された答え。 –

+5

イゴール、学校プロジェクト全体のポイントは、あなた自身で何かをすることができ、割り当てを得るために必要なものを学ぶことです。私はあなたのコードを書くことができますが、そうではありません。 ? – Mikkel

答えて

0

まず第一に、あなたがシャッフルを使用することができないことを記述し、それはあなたがそれを実装することは禁止されていることを意味するものではありません。実際にはそれほど難しいことではありません。

あなたはWikipediaで見られるような、フィッシャーイェーツshuffleを使用し、それを行うにしたい場合:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

(ところで、あなたは、このようなWikipediaの記事を見つけた場合、学校に行っているので、 - または任意の他の記事 - 面白いことに、先生に、簡単に得られたグッドグレードのエッセイを提出するように教えてください)

もちろん、これはシャッフルするベクトルがあることを前提としています。 "0から10億の間の乱数")。この場合、あなたが行きたいかもしれません:0..m内のnの乱数を見つけるには

1. Initialize an empty list of already used random numbers which is ordered, called "numbers" 
2. for i = 0..n-1 
     2a: r = random(0..m-i) (uniform distribution) 
     2b: for every entry in numbers 
      if entry <= r, r++ 
     2c: sort r into numbers (maybe by using a single bubblesort step) 

をこれが生成される数値の量を以前のように、ベクトルの大きさから複雑さをシフトします。

説明:すべての繰り返しで、未使用の番号を探したいとします。 r番目の未使用数(反復iでは0..m-iの未使用数の範囲があります)が見つかりました。今度は、rth未使用の番号を調べるだけです。これは内部反復によって行われます。現在の状態:numbers = {5、1}、r = 4. r < 5 - >何もしないため、この例のためにソートする必要があります。 r> = 1 - > r ++である。 r = 5で終わり、二重のエントリーを得た。

結果のリストにソートしたくない場合は、2つのリストを表示するだけです。

関連する問題