Random-Abfrage in SQLite nach Wahrscheinlichkeiten

J

Jooker86

Neues Mitglied
0
Hi zusammen,

ich möchte aus einer Tabelle meiner Datenbank einen zufälligen Wert abfragen. Das mache ich mit dem Random()-Befehl. Aber ist es auch möglich, den Werten in der Datenbank Wahrscheinlichkeiten zuzuordnen? Also mit welcher Wahrscheinlichkeit sie ausgewählt werden? Als unsaubere Lösung hätte ich die Einträge einfach öfter bzw. seltener eingetragen, also z.B.

1 1 1 1 1 2 3 4 5 6

So würde zu 50% die 1 gewählt werden und zu jeweils 10% eine andere Zahl. Das Problem hierbei ist nur, dass ich oft auch mehrere Werte wählen lasse und ich aber nicht möchte, dass einer mehrfach vorkommt. Gibts dazu einen Befehl?

Vielen Dank schonmal!
 
Hallo,

eigentlich sind Datenbanken nicht dafür gemacht worden. In der Datenbank speichert man nur daten, und am besten atomar. Wenn du einen Zufallsgenerator brachst, solltest du mit einer Funktion lösen.

Du brauchst nur eine random - Funktion, und ein paar if - Abfragen.
 
Oder du bindest dir sogar random.org in dein Programm ein. Die bieten eine API. Aber ja, ansonsten würde z. B. auch ein einfaches Array reichen, wo z. B. die Primary Keys von der Datenbank drinnen sind und dann einfach mit der Random Funktion von Java den Primary Key vom Index X nehmen. Dann kannst du mit einem einfachen select Befehl den Datensatz von der Datenbank holen. :)
 
Kein wirklich guter Vorschlag. Der Primärschlüssel muss nicht unbedingt eine Zahl sein, geschweige dass er mit 1 anfängt, und wird immer um eins hochgezählt wird. Das funktioniert auch nicht mit autoincrement. Spätestens wenn man Daten aus der Datenbank löscht, ist es keine einfache Aufzählung von 0 bis n mehr.
Auch kann der Primärschlüssel aus zwei Werten bestehen (2NF).

Alles was sich berechnen lässt gehört NICHT in eine Datenbank, sondern in eine Funktion.
Sonst könnte ich ja auch alle möglichen Ergebnisse einer Multiplikation in einer Datenbank speichern, und dies dann einfach mit SELECT in der Datenban suchen und ausgeben.

Wenn Du den Vorschlag von PJF16 benutzen willst, muss du relativ viel Aufwand betreiben. Um den foobar zu reduzieren solltest du vielleicht mit List bzw. ArrayList arbeiten.
 
Ok, verstehe! Ich dachte, es gibt einen speziellen Befehl, mit dem man soetwas steuern kann. Aber dann werde ich wohl wirklich mit IF bzw. WHILE arbeiten.

- 1. Auswahl abfragen
- 2. Auswahl abfragen
- IF 2. Auswahl == 1. Auswahl dann nochmal 2. Auswahl abfragen

Mit der Wahrscheinlichkeit fällt mir aber kein anderer Weg ein, als die Datensätze einfach öfter bzw. seltener zu erstellen. Da die Datenbank nur lesbar sein wird und nicht beschreibbar, und die Tabelle auch eher übersichtlich groß ist, sollte das schon funktionieren.

Vielen Dank für eure schnelle Hilfe!
 
Wenn die Datenbank nicht schreibbar ist und übersichtlich groß wofür brauchst du sie dann? Klingt nach Kanonen und Spatzen.
Kannst du die Werte nicht einfach in ein flat File schreiben und das komplett einlesen, wenn du es brauchst? Dann hast du keinen Medienbruch, sondern bist die ganze Zeit im Java Code und kannst deinen random Algorithmus vielleicht einfacher implementieren.
 
Ich meinte, dass die eine Tabelle, die für diesen Vorgang abgefragt wird, nur klein ist. In der Datenbank sind schon noch größere Tabellen. Mein Gedanke war eher umgekehrt: Wenn ich schon eine Datenbank habe, dann lass ich nicht auch noch zusätzliche Files anlegen.

Um das ganze nochmal klar darzustellen für andere, die eventuell nach so etwas suchen (weil ich meine Frage oben nicht vollständig gestellt habe, merke ich grad):

Die Datensätze bestehen aus 2 Komponenten:
Modifikator z.B. +1 oder +2 aber auch +10 oder +20
und
Wert z.B. A, B, C
Dabei können aber A und B nur mit +1 oder +2 und C nur mit +10 oder +20 vorkommen.
Ich möchte nun 2 zufällige Datensätze rausziehen, wobei der Wert-Komponent nicht doppelt vorkommen darf. (+1A und +2A wäre also nicht erlaubt)

Meine laienhafte Vorgehensweise hierfür wäre eine kleine Tabelle in der Datenbank mit 3 Spalten einzurichten, etwa so:

Spalte 1
Mod.A+B
+1
+2

Spalte 2
Mod.C
+10
+20

Spalte 3
Werte
A
B
C

Dann würde ich einfach mit Querys zuerst 2 Werte abfragen und mit dem IF-Befehl wie in meinem letzten Kommentar sicherstellen, dass sie unterschiedlich sind.
Dann weiter mit IF Auswahl 1 == C dann Random-Query auf Spalte "Mod.C" ELSE Random-Query auf Spalte "Mod.A+B"
Dann weiter mit IF Auswahl 2 == C dann Random-Query auf Spalte "Mod.C" ELSE Random-Query auf Spalte "Mod.A+B"
Dann jeweils die beiden Werte zusammenfügen und darstellen lassen.

Falls jemand von den Profis hier das für kompletten Schwachsinn hält, bin ich gern offen für Kritik oder bessere Vorschläge. Allerdings arbeite ich immer lieber mit einfachen Befehlen und lege dafür meine Daten "umständlicher" an :)
 
Zuletzt bearbeitet:
Bevor das hier endgültig ausufert, habe ich ein paar Fragen für das Verständnis:

- Ist das ganze für ein Spiel?
- Verändern sich die Datensätze häufig, oder bleiben sie konstant?
- Willst du nur ein Zahlenpaar zurück geben?


Noch eine Erklärung.
Datenbanken sind dafür dar, Daten permanent zu speichern, und dies Daten durchsuchen.
SQLite ist keine richtige Datenbank, sondern besteht aus einem File, dass im internen Speicher liegt. Das heißt, Lese- und Schreibzugriffe in die Datenbank sind relativ langsam, und sehr aufwendig.
 
1. Ja, das ganze soll mal ein Spiel werden.
2. Die Datensätze verändern sich nicht. Die Datenbank ist fix und stellt nur Daten zum Abruf zur Verfügung.
3. Ja, es sollen nur Paare abgerufen werden.

Ich weiß, dass die Nutzung einer Datenbank in einigen Bereichen anders gedacht ist, als ich es teilweise tue, aber solange ich auf kein Problem stoße, dass mir zeigt, dass bisher alles falsch war, was ich gemacht hab, finde ich, ist das in Ordnung :)
 
Ich hoffe, du hast nichts dagegen, dass dein Spiel manipuliert wird. Denn eine Datenbank lädt dazu ein (Root). Dann solltest du am besten ein Benutzerinterface zum ändern der Datenbank schreiben.

Und sonst gilt einfach das Kiss-Prinzip. Man nimmt immer die einfachste Lösung. KISS-Prinzip – Wikipedia

Genau so kompliziert: Du könntest die Werte auch als Pixel in ein Bitmap hinterlegen. Rot, Grün, Blau -> ergibt drei Werte. Das müsste passen ;)
Und ich befürchte, die Lösung ist ungefähr genauso schnell.
 

Ähnliche Themen

R
Antworten
6
Aufrufe
982
swa00
swa00
R
Antworten
4
Aufrufe
712
Rapidoman
R
Zurück
Oben Unten