Random mit Prioritäten?

-ben-

Mitglied
Tach zusammen!

Ich habe mehrere Objekte. Jedes dieser Objekte hat eine Gewichtung zwischen 1 und 100. Nun möchte ich eines dieser Objekte durch Random auswählen, jedoch unter Berücksichtigung der Prioritäten.

Bsp:
Objekt1: Priorität 100
Objekt2: Priorität 60
Obejkt3: Priorität 50

Ich wähle ein Objekt aus. Die Wahrscheinlichkeit dass es Obj1 sein wird ist am höchsten, jedoch soll es auch möglich sein, dass Obj2 oder Obj3 ausgewählt werden.

Wer hat eine Idee?

Gruss ben
 
Hallo!

wie waere es denn, wenn du die Prioritaeten einfach mit dem Random-Wert multiplizieren und dann den groesten Wert nehmen wuerdest?

Gruss Tom
 
Hm, Thomas, könntest du das erläutern...

Meine erste Idee wäre, alle Prioritätenwerte zusammenzuzählen (in deinem Beispiel 210) und eine Zufallszahl zwischen 1 und dieser Summe zu berechnen. Liegt die Zufallszahl zwischen 1 und 100, wird Objekt 1 gewählt, zwischen 101 und 160 Objekt 2, etc. Hilfsreich wärs vielleicht, die Priorität als Prozentsatz anzugeben, soll heißen, die Summe aller Prioritäten ist 1.
 
Hi!

Ich würde die Priorität auch in % angeben, so ist die Entscheidungsgrundlage um einiges leichter. Vorallem kann man, laut Wahrscheinlichkeitsrechnung ... , die Anzahl der Randomdurchgänge, sprich das Auswahlverfahren, miteinfließen lassen.

Gruß
TOM
 
Danke für eure Inputs!

Ich finde die Methode die matdacat vorgeschlagen hat gut. Die von Tom denke ich mal ist Mathematisch nicht ganz korrekt.

Gruss ben
 
Hallo!

Wie wär's denn damit?
Code:
/**
  * 
  */
 package de.tutorials;
 
 import java.util.Random;
 
 /**
  * @author Tom
  * 
  */
 public class PriorityRandomExample {
 
 	static Random rnd = new Random();
 
 	static PriorityObject[] priorityObjects = {
 			new PriorityObject(100, "Objekt1"),
 			new PriorityObject(60, "Objekt2"),
 			new PriorityObject(50, "Objekt3") };
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 
 		for (int i = 0; i < 100; i++) {
 			PriorityObject po = getRandomObject();
 			System.out.println(po);
 		}
 
 	}
 
 	private static PriorityObject getRandomObject() {
 
 		PriorityObject current = null;
 		double highestPriority = 0.0D;
 
 		for (int i = 0; i < priorityObjects.length; i++) {
 			PriorityObject priorityObject = priorityObjects[i];
 			double currentPriority = priorityObject.getProbability()
 					* rnd.nextDouble();
 			if (currentPriority > highestPriority) {
 				highestPriority = currentPriority;
 				current = priorityObject;
 			}
 
 		}
 
 		return current;
 	}
 
 	static class PriorityObject {
 		private double priority;
 
 		private String data;
 
 		private static double prioritySum = 0.0;
 
 		public PriorityObject(double priority, String data) {
 			this.priority = priority;
 			this.data = data;
 			prioritySum += priority;
 		}
 
 		public double getPriority() {
 			return priority;
 		}
 
 		public String getData() {
 			return data;
 		}
 
 		public void setData(String data) {
 			this.data = data;
 		}
 
 		public String toString() {
 			return super.toString() + " data: " + data + " priority: "
 					+ priority;
 		}
 
 		public double getProbability() {
 			return priority / prioritySum;
 		}
 	}
 }

Gruß Tom
 
Zurück