Permalänk

PHP - slumpa unika tal

Hej håller på med sak under en tid nu,
hör försökt att slumpa fram tal från ett viss värde men utan att något av de slumpade skall bli samma.

Exempel om min kod ser ut så här.
$tal = 10;

$random = (rand()%$tal);
$random2 = (rand()%$tal);
$random3 = (rand()%$tal);
$random4 = (rand()%$tal);

echo $random;
echo $random2;
echo $random3;
echo $random4;

Så får jag fram t.ex 1385, 1405, 1337, 1445 etc.
Hur gör jag så att jag Alltid talen blir unika dvs 1234, 9876, 5732, 1425, 8762 etc.
Jag har försökt massor med olika if satser och switch men tyvärr inte lyckat få det fungera av någon anledning.

Hoppas ni förstår vad jag menar, ha de bra!

Permalänk
Medlem

Nu kan jag inte någon php direkt men hade det varit python hade jag gjort så här:

import random # Skapa en lista som sparar alla slumptal du får (array?) hittadeVärden = [] onOff = True while onOff: # Ta fram ett slumtal och printa det (echo). varde = random.randint() print varde # Om detta slumptal finns i listan hittadeVärden. # hoppa då över att göra någonting^^ if varde in hittadeVarden: # Vi gör ingenting pass else: # Nu fanns inte slumptalet så vi slänger in detta i hittadeVärden. hittadeVärden.append(värde) # När du är färdig stänger du av while, # tex i en if sats där antal värden i listan är lika med 10 # som synes nedan: if len(hittadeVärden) == 5: onOff = False # Visa hela listan. print hittadeVärden

Så här borde det se ut när scriptet är kört:

2344 4325 8562 3254 3522 [2344, 4325, 8562, 3254, 3522]

Så det behöver inte vara så svårt. Försök bara hitta ett sätta att söka igenom din lista (array?)
Hoppas detta hjälpte lite.

Visa signatur
Permalänk
Datavetare

Detta är samma exempel som du hade ovan men där samma nummer aldrig förekommer två gånger

$rnds = range(0,9); /* skapa array(0,1,2,3,4,5,6,7,8,9) */ shuffle($rnds); /* kasta om elementen i slumpmässig ordning */ echo array_pop($rnds); /* ta bort och skriv ut sista, d.v.s 10:e, elementet*/ echo array_pop($rnds); /* ta bort och skriv ut sista, d.v.s 9:e, elementet*/ echo array_pop($rnds); /* ta bort och skriv ut sista, d.v.s 8:e, elementet*/ echo array_pop($rnds); /* ta bort och skriv ut sista, d.v.s 7:e, elementet*/

De tal som kan komma med är de tal man lista i sin "range", i detta fall alla tal från 0 till 9.

Edit: och det kanske är lämpligt att ha lite förklaring kring vad som händer ovan...

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk

Tack så mycket, nu när jag läser det bör jag nog har kunnat det.

Permalänk
Medlem

Följande kod ger 100 unika slumptal i arrayen $r. Det går naturligtvis att använda associativa arrayer för att slippa momentet array_unique men jag tyckte detta var klarare.

<?php $r = array(); $num = 100; while(count($r) <= $num) { $r[] = rand(); $r = array_unique($r); } print_r($r); ?>

Permalänk
Medlem

Har för mig att php har haft någon function kallad uniqid. Jodå: http://php.net/manual/en/function.uniqid.php

Då kan man väl köra typ; uniqid(rand(), true)

Visa signatur
Permalänk
Medlem
Skrivet av Drager:

Har för mig att php har haft någon function kallad uniqid. Jodå: http://php.net/manual/en/function.uniqid.php

Då kan man väl köra typ; uniqid(rand(), true)

Helt fel lösning för detta problemet.

Permalänk
Hedersmedlem
Skrivet av bubbleq:

Nu kan jag inte någon php direkt men hade det varit python hade jag gjort så här:

import random # Skapa en lista som sparar alla slumptal du får (array?) hittadeVärden = [] onOff = True while onOff: # Ta fram ett slumtal och printa det (echo). varde = random.randint() print varde # Om detta slumptal finns i listan hittadeVärden. # hoppa då över att göra någonting^^ if varde in hittadeVarden: # Vi gör ingenting pass else: # Nu fanns inte slumptalet så vi slänger in detta i hittadeVärden. hittadeVärden.append(värde) # När du är färdig stänger du av while, # tex i en if sats där antal värden i listan är lika med 10 # som synes nedan: if len(hittadeVärden) == 5: onOff = False # Visa hela listan. print hittadeVärden

Så här borde det se ut när scriptet är kört:

2344 4325 8562 3254 3522 [2344, 4325, 8562, 3254, 3522]

Så det behöver inte vara så svårt. Försök bara hitta ett sätta att söka igenom din lista (array?)
Hoppas detta hjälpte lite.

Bara för att det nämndes: hade det varit Python, så:

>>> from random import sample >>> sample(range(10000), 5) [8176, 3837, 6817, 4206, 1363]

Ger direkt fem slumpade tal mellan 0 och 10000 utan återläggning .

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk

Jag var kanske lite otydligt. Det jag menade var att jag ville ha 4 (olika) tal, alltså t.ex 1,4,5,6, inte 1456. Men jag gjorde som virutal void sa till mig och det fungerade utmärk till mitt ändamål, men tack så mycket.

Permalänk
Medlem
Skrivet av phz:

Bara för att det nämndes: hade det varit Python, så:

>>> from random import sample >>> sample(range(10000), 5) [8176, 3837, 6817, 4206, 1363]

Ger direkt fem slumpade tal mellan 0 och 10000 utan återläggning .

Hehe, ja där slog du mig allt på fingrarna Dock händer det rätt ofta när jag arbetar med python, skriver en väldans massa kod som redan finns i enklare form. Detta är en utav anledningarna till att jag inte gillar python alltid, det blir nästan lite för lätt ibland!

Fast med sample så måste range kunna vara > sista värdet (5)? Så om hans uppgift var att få ut 150 slumptal måste range vara minst range(0,150). I så fall skulle det inte fungera om man bara fick använda 0 till 10.. Men vänta nu! Det blir ju samma problem med min kod? Bara att jag inte har definerat inom vilket intervall random ska hämta från, nu kan ju siffrona bli helt hur som helst hehe.
Aja, nu lärde jag mig en del, tack

Visa signatur
Permalänk
Hedersmedlem
Skrivet av bubbleq:

Hehe, ja där slog du mig allt på fingrarna Dock händer det rätt ofta när jag arbetar med python, skriver en väldans massa kod som redan finns i enklare form. Detta är en utav anledningarna till att jag inte gillar python alltid, det blir nästan lite för lätt ibland!

Haha, ja, det finns exempel på när jag suttit och skrivit Pythonprogram på 40-50 rader och det fungerat på första körningen! Varken kompilerings- eller logikfel! Det är ju inte så programmering ska vara!

Skrivet av bubbleq:

Fast med sample så måste range kunna vara > sista värdet (5)? Så om hans uppgift var att få ut 150 slumptal måste range vara minst range(0,150). I så fall skulle det inte fungera om man bara fick använda 0 till 10.. Men vänta nu! Det blir ju samma problem med min kod? Bara att jag inte har definerat inom vilket intervall random ska hämta från, nu kan ju siffrona bli helt hur som helst hehe.
Aja, nu lärde jag mig en del, tack

Om han ska få 150 slumptal utan återläggning så måste han ha minst 150 tal att välja från.

Läser frågan igen, och

>>> sample(range(10), 4)

verkar vara exakt det han vill ha (om det nu hade varit Python, vilket det inte är). Möjligen med ett off-by-one-error, men det vet jag inte om jag inte vet tänkt implementation (kanske range(1, 10) är mer önskat, vad vet jag?).

"kompilatorfel" → "kompileringsfel"
Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av iXam:

Helt fel lösning för detta problemet.

Måste tolkat det fel..

Visa signatur
Permalänk
Medlem
Skrivet av Sp4rgr1sen:

Jag var kanske lite otydligt. Det jag menade var att jag ville ha 4 (olika) tal, alltså t.ex 1,4,5,6, inte 1456. Men jag gjorde som virutal void sa till mig och det fungerade utmärk till mitt ändamål, men tack så mycket.

Modifierad :

<?php $r = array(); $num = 4; while(count($r) < $num) { $r[] = rand()%10; $r = array_unique($r); } print_r($r); ?>