Wie programmiert man eine diskrete Seltenheit?

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
Finnian87
Beiträge: 2
Registriert: 01.12.2025, 10:51

Wie programmiert man eine diskrete Seltenheit?

Beitrag von Finnian87 »

Hallo Team!

Ich bin gerade dabei, das Design meines Beutesystems fertigzustellen, und suche nach einer Lösung, um die subtile Seltenheit bestimmter Gegenstände zu verwalten.
Meine Idee ist es, Gegenstände zu erstellen, die auf den ersten Blick sehr gewöhnlich erscheinen (sie haben einen Standardnennwert), deren wahre Seltenheit jedoch in einem ganz bestimmten internen Attribut liegt (ihrem „Prägejahr” oder ihrer „Werkstatt”). Ich möchte, dass nur erfahrene Spieler diese limitierte Serie sofort als die begehrteste erkennen können.

Hat jemand von euch schon einmal ein bedingtes Glückssystem programmiert, bei dem eine extrem niedrige Drop-Rate für eine Variante eines gewöhnlichen Gegenstands gilt?
xTr1m
Beiträge: 30
Registriert: 08.08.2025, 20:08

Re: Wie programmiert man eine diskrete Seltenheit?

Beitrag von xTr1m »

Ich kenne mich deterministischem Zufall aus.
Ohne geneauere Details zu deinem Projekt zu kennnen, kann ich zu bedingtem Glück folgendes sagen:
Zunächst sollte man mit einer einzigen RNG Instanz arbeiten, welche man mit einem Seed initialisieren kann. Dadurch hat man schon mal Determinismus.
Wenns um Drops aus einer Loot-Table geht, würde ich erstmals ermitteln wieviele Items enthalten sind, und dann für jedes Item mit dem RNG ein Index würfeln lassen. Damit weiß man schon, welche Items aus der Loot-Table gedroppt wurden.
Jetzt kann es pro Item eine gewisse Chance c geben, dass das Item anders ist. Sobald so ein Item-Index vom RNG gewürfelt wurde, lässt man den RNG nochmal würfeln, aber diesmal soll er eine reelle Zahl p zw. 0 und 1 erstellen. Da reicht es wenn man mit einem einfachen if prüft, ob p<=c ist, und modifiziert daraufhin das Item, bevor es mit dem Würfeln der anderen Indices weiter geht.
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 625
Registriert: 05.07.2003, 11:17

Re: Wie programmiert man eine diskrete Seltenheit?

Beitrag von Lord Delvin »

Das ist ein reines UI-Problem. Deine interne Zustandsverwaltung musst du ja nicht komplett auf dem UI exponieren.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
joeydee
Establishment
Beiträge: 1206
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Wie programmiert man eine diskrete Seltenheit?

Beitrag von joeydee »

Wie du die Seltenheit dem Spieler gegenüber vermittelst (Prägejahr, ...), ist reine Designsache.

Auf Programmierseite kann sowas ungefähr so aussehen (wenn du z.B. die Items mit eindeutigen IDs verwaltest):

bool subtileSeltenheit(uint uniqueID,double chance){ return pseudorandom(seed=uniqueID,lower=0,upper=1)<=chance;}

Wobei pseudorandom() hier eine determinierte Zufallszahl auf Basis eines Seeds liefert. Wenn chance z.B. 1/100 ist (==0.01), liegt im Schnitt jede hundertste Pseudorandom-Zahl unter diesem Schwellwert und liefert "true". Macht Sinn für Ressourcen, die on-the-fly quasi endlos erzeugt werden müssen, weil der Wert erst auf Abruf erzeugt wird und nicht als Eigenschaft gespeichert werden muss. Z.B. Ressourcen in Open-World-Games. Da kann man auch den Seed aus der initialen Spawnposition "hashen", so mache ich das i.d.R.
In meinem letztjährigen ZFX-Action-Beitrag wurden so z.B. Hagebutten-Ressourcen in der Landschaft verteilt, welche lediglich "besondere" Büsche mit bestimmtem Seltenheitswert waren.

Wenn es eine feste Anzahl Items im Spiel gibt, kann man stattdessen auch einfach eine Liste von 990 "normalen" und 10 "besonderen" Items erzeugen und diese Liste durchmischen.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2848
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Wie programmiert man eine diskrete Seltenheit?

Beitrag von Jonathan »

joeydee hat geschrieben: Gestern, 06:54
Wenn es eine feste Anzahl Items im Spiel gibt, kann man stattdessen auch einfach eine Liste von 990 "normalen" und 10 "besonderen" Items erzeugen und diese Liste durchmischen.
Ja, genau. Die Frage ist, will man wirklich kompletten Zufall? Vielleicht ist es netter, wenn garantiert ist, dass man innerhalb von 10 Stunden spielen mindestens einen guten Gegenstand findet.

Man kann die Verteilung sogar noch mehr anpassen. Man generiert die Wahrscheinlichkeiten für die nächsten 10.000 Drops (reicht für alle Gegner die man die nächsten 10 Stunden killt) und würfelt dann zufällig die Position des besonderen Gegenstandes. Um es noch besser zu machen, kann die Position auch erst bei 5.000 losgehen, d.h. am Anfang des Spiels kriegt man auch mit Glück noch keinen total übermächtigen Gegenstand. Man kann auch die Position zwischen 5000 und 10000 Würfel und dann nochmal um einen zufälligen Wert zwischen 0 und 2000 nach vorne schieben. Damit verschiebt sich die Wahrscheinlichkeitsverteilung, es gibt eine sehr geringe Chance etwas gutes schon nach 3000 kills zu finden, aber davon ausgehen, dass man wirklich etwas findet, kann man erst ab 5000. Außerdem ist es unwahrscheinlich, aber nicht ausgeschlossen, das man bis ganz ans Ende warten muss.

Kurzum: Eine Normalverteilung mag das mathematisch zufälligste sein, aber nicht unbedingt das beste Spieldesign. Man muss sich erst überlegen, welche Verteilung am besten zum Spieldesign passen würde und dann, wie man diese modelliert (der zweite Teil ist aber der leichtere).

Wenn nicht klar ist, was "Wahrscheinlichkeitsverteilung" oder "Probability-Density-Function" genau bedeutet, wäre jetzt btw. ein guter Zeitpunkt sich diese Konzepte mal ranzuschaffen.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Alexander Kornrumpf
Moderator
Beiträge: 2180
Registriert: 25.02.2009, 13:37

Re: Wie programmiert man eine diskrete Seltenheit?

Beitrag von Alexander Kornrumpf »

Ich war erst verwirrt, weil ich dachte, es geht um diskret im Gegensatz zu kontinuierlich, so wie in "diskrete Verteilung".
Antworten