Wie bekommt man einen zufälligen Wert von 1~N, aber ohne einige bestimmte Werte in PHP?
rand(1,N)
aber ohne array(a,b,c,..)
,
gibt es bereits eine integrierte Funktion, die ich nicht kenne oder muss ich es umsetzen, mich(wie?) ?
UPDATE
Die qualifizierte Lösung haben sollte, gold Leistung, ob die Größe der excluded array
groß ist oder nicht.
- Ist Ihr "ausgeschlossen array' wahrscheinlich sortiert werden? Wenn ja, können Sie entfernen Sie die
asort()
Aufruf meiner Funktion, die sollte die Dinge beschleunigen sich erheblich. - Er
sort()
. Sorry, wurde daraufhin an das für zu lange. >.> (Off schnappen etwas frische Luft!) - Re: "scheint, dass ich einige Zeit brauchen um zu verdauen Ihre Lösung", eine Visualisierung dessen, was mein Algorithmus funktioniert: pandora.pinkgothic.com/randWithout.png (außer bitte stellen Sie sich der rand(0,8) liest rand(1,8), bin ich durch Reifen springen hier für Bilder hochgeladen, ich war in Eile. XD)
- pandora.pinkgothic.com/randWithoutFixed.png - gibt. Es war nervt mich.
- Ausgezeichnete Lösung:)
- Glee. Manchmal sagt ein Bild mehr als tausend Worte? 🙂 Froh, dass ich helfen konnte!
- eine Menge!BTW,was graphical editing-tool hast du benutzt?Es ist sehr praktisch!
- Nur GIMP ( gimp.org ). Es gibt bessere Werkzeuge zum zeichnen von gefüllten Boxen, wohlgemerkt! 🙂 Es ist einfach passiert zu sein, die ich in Benutzung hatte (vorinstalliert computer arbeiten und alle).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Keine eingebaute Funktion, sondern Sie könnte hierzu:
Dass aus der Spitze von meinem Kopf, so dass Sie es verwenden könnte, Polieren - aber zumindest können Sie nicht am Ende in einer endlos-loop-Szenario, auch hypothetisch.
Hinweis: Die Funktion wird unterbrochen, wenn
$exceptions
erschöpft Ihre Reichweite - z.B. AufrufrandWithout(1, 2, array(1,2))
oderrandWithout(1, 2, array(0,1,2,3))
wird nicht nachgeben etwas vernünftiges (natürlich), aber in diesem Fall die zurückgegebene Zahl wird außerhalb der$from
-$to
Bereich, so dass es leicht zu fangen.Wenn
$exceptions
garantiert wird, sortiert bereitssort($exceptions);
entfernt werden kann.Eye-candy: Etwas minimalistische Visualisierung des Algorithmus.
$exceptions
im code.if ($number >= $exception)
. Im wesentlichen, was der code macht, ist die Reduzierung der Reihe von zahlen, die den Betrag, den Sie tatsächlich benötigen (und erfordern somit nur einen Lauf durch die Funktion), dann überspringt die Lücken als pro, was$exceptions
definieren.randWithout(1, 10, array(5, 8))
.$number
istrand(1, 10-2)
==rand(1, 8)
, also, sagen wir mal, in diesem Beispiel, dass wir$number == 7
. Dann wird das foreach läuft durch die geordnete array und prüft$number >= $exception
, die7 >= 5
(ja, so$number == 8
), dann8 >= 8
(ja, so$number == 9
), und spuckt9
auf Sie.randWithout(1, 10, array(5, 8))
wieder, mitrand
geben uns$number == 2
. Die foreach zu laufen beginnt, durch das array, aber Hinweise$number < 5
, bricht aus der Schleife und zurück2
. [BTW, ich bearbeitet meine post zu beheben, dieelse
, die zusätzliche if-Bedingung war Fremd, es war immer, um wahr zu sein nach derif
.]count()
gibt eine Zahl zurück, die größer als der bereitgestellte Bereich für glühen, Härten, so wie ein heads-up.randWithout(1, 2, array(1, 2, 3, 4))
gibt0
oder5
.randWithout(1, 2, array(1, 2, 3, 4, 5))
gibt-1
,0
oder6
. Sie erhalten das wesentliche. Sie sind Ausnahmefälle und unwahrscheinlich, vielleicht, aber gut zu wissen. Sie werden wissen, Ihre$exceptions
array war falsch, wenn der Wert der Funktion zurückgegeben wird, die außerhalb des Bereichs$from
-$to
.rand()
(odermt_rand()
wenn Sie gehen). Wenn Sie Vertrauen, die Funktion Ihrer Wahl, um die Rückkehr gut verteilten Werte, dann wird das auch. Es hat natürlich Lücken, die aber nur die Lücken, die Sie wollen. So... iunno, Sie habe verwirrt mich. Was , die Sie kritisieren?Ich glaube nicht, dass es so eine Funktion built-in ; Sie werden wahrscheinlich haben, um code es selbst.
Code, haben Sie zwei Lösungen :
array_rand
abholen ein Wert von esMagic()
, wurde noch nicht geschrieben in PHP noch nicht.Je nach genau das, was Sie brauchen, und warum dieser Ansatz könnte eine interessante alternative sein.
So, wenn Sie nicht brauchen, zu generieren, die Menge der möglichen zahlen jedes mal, aber generieren, die einmal festgelegt und dann Kommissionierung eine Reihe von Zufallszahlen aus dem gleichen Satz, könnte dies ein guter Weg zu gehen.
shuffle()
undarray_rand()
kombiniert werden könnte, übertrieben (oder vielleicht nicht genug, hängt vom Kontext ab), aber es ist definitiv bekommt den job getan!N
ist huge.@pinkgothic scheint ich brauche einige Zeit, um zu verdauen Ihre Lösung:)N
ich es bevorzugen, Ihre Lösung auf meins, da deins ist viel besser lesbar. 🙂 Unterschätzen Sie nie lesbaren code!Der einfachste Weg...
Was Sie tun müssen, ist zu berechnen ein array übersprungen Standorten, so dass Sie können wählen Sie eine zufällige position in einem kontinuierlichen array mit der Länge
M = N - #of exceptions
und einfach die Karte wieder in den ursprünglichen array mit Löchern. Dies erfordert Zeit und Raum gleich übersprungen array. Ich weiß nicht, von php aus ein Loch in den Boden, so verzeihen Sie die textliche semi-psudo-code Beispiel.i
Elemente im ursprünglichen array.r
im0..M
die Anzahl der verbleibenden Elemente.i
so dassOffset[i] <= r < Offest[i+i]
dies ist einfach mit einer binären Sucher + i
Nun, das ist nur eine Skizze, die Sie benötigen, um mit den enden des arrays und wenn die Sachen indiziert sind 0 oder 1, und all that jazz. Wenn Sie geschickt sind, können Sie tatsächlich die Berechnung der Offset-array on the fly " aus dem original, es ist ein bisschen weniger klar, dass die Art und Weise, obwohl.
Vielleicht ist es zu spät für die Antwort, aber ich fand dieses Stück code der irgendwo in meinem Hinterkopf, wenn Sie versuchen, um zufällige Daten aus Datenbank, basierend auf random-ID mit Ausnahme einiger Anzahl.
HTML:
$excludedData
ist groß, das ist die Art von Sache, die Gtker scheint vermeiden zu wollen.Dies ist die Schnellste & beste Leistung Weg, es zu tun :