PHP PHP mt_rand mit Chance

Skidrow1988

Lt. Commander Pro
Registriert
Nov. 2014
Beiträge
1.067
Hallo, ich bin noch immer an einem kleinen Spiel am basteln. Dort sollen Objekte durch Zufall entstehen. Dabei soll eine gewisse Chance vorhanden sein, welches Objekt kommt. Manche sollen halt seltener vorkommen.

Meine Idee war so:
Ein random int von 1 bis 10.
1 - 2 = Objekt 1
3 - 10 = Objekt 2

Somit hätte Objekt 1 eine 20% Chance aufzutauchen und Objekt 2 kommt auf 80%.

Ist mein Ansatz richtig? Ich wollte das morgen Mal austesten in dem ich 100.000 Einträge in einer MySQL Datenbank generiere. Oder gibt es da eine bessere Variante für eine solche Geschichte? Natürlich sollen später deutlich mehr Objekte vorkommen als diese.
 
Das Prinzip stimmt, bei 1-100 hast du Prozente. Du mapest deine Items auf den Zahlenraum und würfelst aus.

Deine Test überprüft aber nicht deine Idee sondern deinen RND Generator
 
  • Gefällt mir
Reaktionen: tollertyp
mt_rand würde ich auch nutzen. Ist etwas schneller und zufälliger.
Ergänzung ()

tRITON schrieb:
Deine Test überprüft aber nicht deine Idee sondern deinen RND Generator
Das war auch tatsächlich die Idee dahinter. Ich weiß halt nicht, ob da der Zufall ausreicht um das halbwegs vernünftig umzusetzen.


Ich kann ja den Zahlenraum auch noch erweitern. Dann könnte ich auch feiner abstimmen und mehr Objekte mit rein nehmen. Zumindest meine Theorie.
 
Du kannst auch dein RNDs als Tabelle importieren und vorher extern erstellen lassen durch „besseres“ zufälligere System. Musst halt neue Zahlen in Abständen nachlegen
 
Kannst du mir das genauer erklären? Oder meinst du es so, das ein gewisses Kontingent vorhanden ist und dann neues hinzukommt?
 
Sagen wir mal dein Programm braucht 1.000.000 RND pro Std. dann kannst du ja für 24 Stunden Dir Zahlen extern erstellen und gehst nur mit einem Counter weiter auf die nächste Zahl.
Musst halt dann vor Ablauf der Zeit wieder 24t neue Werte einspielen. Wenn die Erzeugung deiner Zufallszahlen zu lange dauert.

Du hast dann eine perfekte Kontrolle vorab, welche Items über den nächsten Tag erstellt werden und an deine Spieler verteilt werden
 
  • Gefällt mir
Reaktionen: Skidrow1988
Warum soll ein größerer Zahlenraum besseren Zufall liefern?
Ob du 1-10 schaust und bei 1 und 2 machst du A und beim Rest B, oder 1-100 und bei 1-20 machst du A und beim Rest machst B, dürfte bei einem halbwegs vernünftigen Pseudozufallszahlengenerator keinen Unterschied machen.

Also wenn es dir nur um die feinere Unterteilung angeht -> klar.

Was das ablegen der Zufallszahlen in eine Datenbank angeht - der Sinn erschließt sich mir nicht so ganz, wozu? Um zu prüfen, ob es zufällig genug ist?
Welche Aussagen wird das über die Zukunft machen?
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: joshim
Naja alles eine Frage der Saklierung. 1-10 oder 1-100: Wenn du nur 2 Item hast reicht 1-10, wenn du 50 Items hast musst du die Range erweitern.

das was @tRITON anspricht, braucht man wenn man von einem grossen Projekt spricht.

Als Beispiel, wenn du ein Smartphone Spiel mit vielen Mitspielern hast, und es auch sehr sehr wertvolle Items gibt die normalerweise ordentlich Geld kosten. Nun machst z.b. für eine Woche eine Aktion, dass der Spieler jeden Tag beim Login ein Item bekommt.

So kannst du die Grunde welche Items du rausgeben willst vorproduzieren. Und z.b. sicher sein, dass das Item das sonst z.b. 100 Euro kostet nur einmal in der Liste erscheint.

Statt das nun beim Login der Zufallgenerator anspringt, bekommt er einfach das nächste noch nicht vergebene Item aus der Datenbank.

Es ist immer noch Zufall, wer was bekommt du hast als Betreiber aber mehr Kontrolle über die Items die rausgeben.

Klar ist wenn man die Aktion verlängert, oder das etwas ist was dauernd läuft muss man die Datenbank permanent mit neuen Items befüllen.
 
Das gucke ich mir Mal an. Danke!
Ergänzung ()

@kim88
So ist es auch. Es sind natürlich mehr als nur 2 Items. Es sind sogar mehr als 20 und dann noch in Abstufungen von 1 - 4.
 
Mehrfaches "Würfeln"
Das erste mal für die Seltenheit (hier bietet sich zB logarithmisch o.ä. an und über die Schwellwerte gut zu skalieren), das zweite für das konkrete Item.

PS: übrigens ist der Tip wegen mt_rand nicht mehr wirklich aktuell! Die Doku sagt zwar 4x schneller, aber mittlerweile ist auch der rand() Algo ein anderer. rand() ist sogar slightly faster.


PHP:
<?php
#php 8.0.6
$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    $random = mt_rand(0, 100);
}
$end = microtime(true);

$runtimeMtRand = $end - $start;

$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    $random = rand(0, 100);
}
$end = microtime(true);

$runtimeRand = $end - $start;

$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    $random = random_int(0, 100);
}
$end = microtime(true);

$runtimeRndInt = $end - $start;

echo "Runtime mt_rand(): " . $runtimeMtRand . " seconds!" . PHP_EOL;
echo "Runtime rand(): " . $runtimeRand . " seconds!" . PHP_EOL;
echo "Runtime random_int(): " . $runtimeRndInt . " seconds!" . PHP_EOL;

Bash:
Runtime mt_rand(): 0.38375616073608 seconds!
Runtime rand(): 0.35204195976257 seconds!
Runtime random_int(): 0.89852905273438 seconds!
 
Zuletzt bearbeitet:
joshim schrieb:
PS: übrigens ist der Tip wegen mt_rand nicht mehr wirklich aktuell! Die Doku sagt zwar 4x schneller, aber mittlerweile ist auch der rand() Algo ein anderer. rand() ist sogar slightly faster.

Danke für den Hinweis.
 
  • Gefällt mir
Reaktionen: joshim
joshim schrieb:
hier bietet sich zB logarithmisch o.ä. an und über die Schwellwerte gut zu skalieren
Puh, da bin ich ehrlich gesagt raus. Was meinst du damit? Ich kenne das nur aus Diagrammen etc. Kannst du mir da ein Beispiel für geben? Also nicht Code, lediglich eines zum Verständnis.
 
ich meine damit sowas wie:
1-10 sind legendary
11-100 sind rar
101-1000 sind selten
1001-10000 sind normal
um das mal von MMORPGs zu übertragen.
Bei einem rand(1, 10000) hast du entsprechend eine höhere Wahrscheinlichkeit für normal (8999 mögliche Chancen). Und beim zweiten rand()/Würfeln entscheidest du das konkrete Item in der Seltenheitsstufe.
Skalieren kannst du das, wenn du zB sagt 1-5 und dann 6-90 und 91-1000
 
Okay, das ist ja genau mein Gedanke gewesen. Ich arbeite glaube ich einfach mit einer loottable. Das sollte am einfachsten sein.
 
Ein Loottable braucht du ja immer (musst ja wissen was es überhaupt gibt). Aber wie willst du die Dropchance entscheiden. Selbst Wow arbeitet mit multiplen Würfen (wie von mir beschrieben). Weil das eben der Weg ist sowas auszuwürfeln. Ok, bei Blizzard wird das noch etwas komplexer sein (Faktoren wie Payment etc), aber vom Prinzip ist es genau so.
 
Zurück
Oben