この記事の例では、Java でのランダムな重みの実装方法を説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
ランダムな重み付けはプロジェクトでよく使用されるため、それをツール クラスに抽象化しました。
ランダムな重みを実装するには、一般に 2 つの方法があります。
1. 配列を使用して、重みに対応する実際のターゲットを格納します。たとえば、A の重みは 2、B の重みは 3 です。この場合、配列の長さは 5 になります。配列の最初の 2 つは、A と を格納します。最後の3店舗B。
次に、数値 [0-データ長) をランダム化し、配列の対応する添字の値を直接取得します。
利点: シンプルなデータ構造、効率的なアルゴリズム、シンプルな実装
短所: 重み値が比較的大きく、データ量が多い場合、メモリが無駄に消費されます。
2. 間隔アルゴリズムを使用して、重みを前から後ろに重ね合わせ、数値 [1-重みの合計] をランダムに割り当て、最初の要素が または より小さい場合、そのランダムな重みを使用して各要素の重みを順番に減算します。 0 に等しいのが Find 要素です
この実装では、Array の binarySearch メソッドを借用できます。
ここをクリックして完全なサンプルコードをダウンロードしてください。
コードを貼り付けます:
WeightMeta.java:
次のようにコード code をコピーします:/**
* RandomMeta オブジェクトを作成するには RandomUtil クラスを使用することをお勧めします
* 14-5-5 の @author wxf。
*/
パブリック クラス WeightMeta<T> {
プライベートファイナルランダム ran = new Random();
プライベート最終 T[] ノード。
プライベートの最終 int[] 重み。
プライベートfinal int maxW;
public WeightMeta(T[] ノード, int[] 重み) {
this.nodes = ノード;
this.weights = 重み;
this.maxW = 重み[重み.長さ - 1];
}
/**
* このメソッドは重み付けされたランダムなオブジェクトを返します
* @戻る
*/
public T ランダム() {
int インデックス = Arrays.binarySearch(weights, ran.nextInt(maxW) + 1);
if (インデックス < 0) {
インデックス = -1 - インデックス;
}
ノード[インデックス]を返します。
}
public Trandom(int ranInt) {
if (ranInt > maxW) {
ranInt = maxW;
else if(ranInt < 0){
ranInt = 1;
} それ以外 {
ranInt++;
}
int インデックス = Arrays.binarySearch(weights, ranInt);
if (インデックス < 0) {
インデックス = -1 - インデックス;
}
ノード[インデックス]を返します。
}
@オーバーライド
public String toString() {
StringBuilder l1 = 新しい StringBuilder();
StringBuilder l2 = new StringBuilder("[ランダム]/t");
StringBuilder l3 = new StringBuilder("[ノード]/t/t");
l1.append(this.getClass().getName()).append(":").append(this.hashCode()).append(":/n").append("[インデックス]/t/t ");
for (int i = 0; i <weights.length; i++) {
l1.append(i).append("/t");
l2.append(weights[i]).append("/t");
l3.append(nodes[i]).append("/t");
}
l1.append("/n");
l2.append("/n");
l3.append("/n");
l1.append(l2).append(l3).toString(); を返します。
}
}
RandomUtil.java:
次のようにコード code をコピーします:/**
* ランダムツール
*
* 重み付けされたコレクション Map を使用して、ランダムなメタデータ オブジェクトを構築します
*
* 例えば:
* 3 つの URL アドレスがあり、それらの重みは 1、2、および 3 です。次に、RandomUtil を使用して、重みに基づいて URL をランダムに取得します。
*
* <p><blockquote><pre>
*
* マップ.put(url1, 1);
* マップ.put(url2, 2);
* マップ.put(url3, 3);
* RandomMeta<String, Integer> md = RandomUtil.buildWeightMeta(map);
* 文字列weightRandomUrl = md.random();
*
* </pre></blockquote><p>
*
* 14-5-5 の @author wxf。
*/
パブリック クラス RandomUtil {
public static <T> WeightMeta<T> buildWeightMeta(final Map<T, Integer> WeightMap) {
最終的な int サイズ = WeightMap.size();
オブジェクト[] ノード = 新しいオブジェクト[サイズ];
int[] 重み = new int[サイズ];
int インデックス = 0;
int 重み加算器 = 0;
for (Map.Entry<T, Integer> each :weightMap.entrySet()) {
ノード[インデックス] = each.getKey();
weights[index++] = (weightAdder = WeightAdder + each.getValue());
}
新しい WeightMeta<T>((T[]) ノード、重み) を返します。
}
}
この記事が皆さんの Java プログラミングに役立つことを願っています。