この記事では、Javaにはランダムの機能を実装する方法、繰り返しの数値を紹介します。あなたが初心者の場合、この記事を読む必要があります。なぜなら、この機能は一般的にインタビュー中に遭遇するからです。私が人々を採用するときを含めて、私はこの質問について他の人に尋ねたいと思っています。主に、問題のモデルと基本的な知識がどのように考慮されるかを見るのが好きです。
私は、この記事が初めて連絡を取り合っている友人を助けることができることを願っています。なぜなら、私はそれを書くことができないか、非常に平らな考え方を使ってそれを達成するために何人かの友人に連絡したからです。
一般的に、いくつかの開発経験を持つ友人はそのような機能を実装できますが、それは単なる効率の問題です。そのような問題に直面したとき、私たちは常にそれをまっすぐな順序で考え、次にループ内の配列に乱数を追加します。数字を追加する過程で、最初にこの数値が配列に存在するかどうかを調べます。この数値が存在しない場合、アレイに直接追加されます。この数値が存在する場合、追加されません。私たちは通常、この方法で問題を検討し、このように機能を実装できます。今私が今言ったように、それは単なる効率の問題です。
この質問の意味をよりよく理解するために、まず特定のコンテンツを見てみましょう。1〜100のランダム配列を生成しますが、配列の数値は繰り返されることはできません。つまり、位置はランダムですが、配列の要素を繰り返すことはできません。
ここでは、配列の長さを指定していません。1〜100の長さを作成できます。
次に、いくつかの実装方法を見て、これらの方法を比較しましょう。
通常、アレイリストまたはアレイを使用して実装します。次のコードに示すように、まずArrayListの実装プロセスを見てみましょう。
java.util.arraylistをインポート;インポートjava.util.random;/** * arraylistを使用した実装 * @description: * @file:demo.java * @author * @author hanyonglu object [] values = new Object [20]; RANDOM RANDOM = new Random(); arrayList <integer> list = new ArrayList <Integer>(); for(int i = 0; i <values.length; i ++){int number = random.nextint(100)+1; if(!list.contains(number)){list.add(number); }} values = list.toarray(); //配列をトラバースして、(int i = 0; i <values.length; i ++){system.out.print(values [i]+"/t");のデータを印刷します。 if((i + 1)%10 == 0){system.out.println( "/n"); }}}}配列を使用して実装するプロセスは次のとおりです。
java.util.random;/** * arraysを使用した実装 * @description: * @file:demo4.java * @packageなし * @author hanyonglu * @author hanyonglu * @author hanyonglu * @author hanyonglu * @date 2012-10-18 06:38 * RANDOM RANDOM = new Random(); for(int i = 0; i <values.length; i ++){int number = random.nextint(100)+1; for(int j = 0; j <= i; j ++){if(number!= values [j]){values [i] = number; }}} //配列をトラバースして、(int i = 0; i <values.length; i ++){system.out.print(values [i]+"/t"); if((i + 1)%10 == 0){system.out.println( "/n"); }}}}上記の2つの実装プロセスは比較的非効率的です。追加するたびに、この数値が現在のリストに存在するかどうかを横断する必要があるため、時間の複雑さはO(n^2)です。このように考えることができます。重複が含まれていないため、ハッシュセットとハッシュマップの機能について考えることができます。ハッシュセットはセットインターフェイスを実装し、セットの数学的定義は複製と順序のないセットです。 HashMapはマップを実装しており、重複を許可しないキーでもあります。このようにして、ハッシュマップまたはハッシュセットを使用してそれを達成できます。
HashMapの実装を使用する場合、そのキーを配列に変換するだけで、次のように問題ありません。
java.util.hashmap; Import java.util.iterator; import java.util.random; import java.util.map.entry;/** * hashmapを使用した実装 * @description: * @file:demo.java * @package None * @author Hanyonglu * @date 2012-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-12 v1.0 */public class demo {public static void main(string [] args){int n = 0; object [] values = new Object [20]; RANDOM RANDOM = new Random(); hashmap <object、object> hashmap = new hashmap <object、object>(); //乱数を生成し、(int i = 0; i <values.length; i ++){int number = random.nextint(100)+1; hashmap.put(number、i); } // hashmap値から配列値をインポート= hashmap.keyset()。toarray(); //(int i = 0; i <values.length; i ++){system.out.print(values [i]+"/t");の配列と印刷データをトラバースします。 if((i + 1)%10 == 0){system.out.println( "/n"); }} // iterator iter = hashmap.entryset()。iterator(); // //トラバーサルハッシュマップ// "/t"); // // if(n%10 == 0){// system.out.println( "/n"); //} //}}}}ハッシュセットとハッシュマップの関係は近すぎるため、ハッシュセットは下部にハッシュマップを使用して実装されますが、値のコレクションとキーのコレクションは1つだけであるため、次のようにハッシュセットを使用して実装することもできます。
Java.util.hashset;インポートJava.util.random;/** * Hashsetを使用した実装 * @description: * @file:test.java * @packageなし * @author hanyonglu * @date 2012-10-18 06:11:41 PM * @version vランダム(); object [] values = new Object [20]; Hashset <integer> hashset = new Hashset <Integer>(); //乱数を生成し、(int i = 0; i <values.length; i ++){int number = random.nextint(100)+1; hashset.add(number); } values = hashset.toarray(); //(int i = 0; i <values.length; i ++){system.out.print(values [i]+"/t");の配列と印刷データをトラバースします。 if((i + 1)%10 == 0){system.out.println( "/n"); }}}}これはもう少し効率的です。配列の長さが制限されている場合は、forループを変換して、whlieループに設定するだけです。以下に示すように:
Java.util.hashset; Import Java.util.random;/** * Hashsetを使用した実装 * @description: * @file:test.java * @packageなし * @author hanyonglu * @date 2012-10-18 05:11:41 PM * @version b1.0/publicクラステストランダム(); object [] values = new Object [20]; Hashset <integer> hashset = new Hashset <Integer>(); //ランダム数を生成し、ハッシュセットを保存しますwhile(hashset.size()<values.length){hashset.add(random.nextint(100) + 1); } values = hashset.toarray(); //配列をトラバースして、(int i = 0; i <values.length; i ++){system.out.print(values [i]+"/t");のデータを印刷します。 if((i + 1)%10 == 0){system.out.println( "/n"); }}}}下の図に示すように、配列の長さを100に設定して、実行中の効果を確認できます。
上記と比較して、ハッシュマップの使用は比較的効率的です。実際、それはハッシュセット、配列、そして最後にアレイリストです。 10000のデータを生成すると、HashMapを使用するには0.05秒、ハッシュセットは0.07、アレイは0.20、アレイリストは0.25秒であることがわかります。興味があれば、チェックアウトする時間を設定できます。
もちろん、HashMapの実装を使用することに加えて、他の効率的な方法があります。たとえば、番号1〜100を配列に保存してから、forループで2つのサブスクリプトをランダムに生成できます。これらの2つのサブスクリプが等しくない場合、配列内の要素を交換できます。実装プロセスは次のとおりです。
java.util.randomをインポート;/** *ランダム位置変換実装 * @description: * @file:demo4.java * @packageなし * @author hanyonglu * @date 2012-10-18 06:54:06 * @version v1.0 */public class demo4 {int int [] int temp1、temp2、temp3;ランダムr = new Random(); for(int i = 0; i <values.length; i ++){values [i] = i+1; } //ランダムに交換値。長さの時間(int i = 0; i <values.length; i ++){temp1 = math.abs(r.nextint())%(values.length-1); // 1つの位置をランダムに生成するtemp2 = math.abs(r.nextint())%(values.length-1); //別の位置をランダムに生成する場合、(temp1!= temp2){temp3 = values [temp1];値[temp1] = values [temp2];値[temp2] = temp3; }} //配列をトラバースし、(int i = 0; i <20; i ++){system.out.print(values [i]+"/t");のデータを印刷します。 if((i + 1)%10 == 0){system.out.println( "/n"); }}}}この方法も比較的効率的です。 10,000のデータが生成された場合、時間がかかる時間は0.054です。
配列内の座標の実装に基づいて、より関連するソリューションを変換することができ、関連情報を詳細に参照できます。
上記は、Javaでランダムで非繰り返しの数字の機能を実装することです。もちろん、方法はこれらのタイプに限定されませんが、他の実装方法があります。しばらく連絡を取り合っていた友人に役立つことを願っています。ジェイドを引き付けて引き付けるのに役割を果たすことができることを願っています。
元のウェブサイト:http://www.cnblogs.com/hanyonglu/archive/2012/10/18/2730007.html
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。