FOK!forum / Digital Corner / PHP vraagje, random nummers
jzzprzaterdag 22 oktober 2005 @ 01:48
Dag allemaal.

Ik moet met PHP een database invullen.
De database heeft 10 records met allemaal een id (1-10 dus)
In iedere record moet ik ergens een nummer (1-10) opslaan.
Ieder nummer mag maar een keer gebruikt worden, en het nummer mag niet hetzelfde zijn als het ID van de record.

Hoe kan ik dit met PHP helamaal random laten gebeuren?

(met andere woorden: iedere record moet naar een andere record verwijzen, er mag geen verwijzing naar zichzelf en er mogen geen dubbele verwijzingen zijn)

Hoop dat het een beetje duidelijk is

Alvast bedankt, Jzzpr
Mappyzaterdag 22 oktober 2005 @ 02:07
Heb je niet meer aan zoiets?
Alternatief kun je zo'n random volgorde ook opslaan.
Er zijn veel dingen makkelijker dan wat je nu wilt, denk ik, maar ik weet niet precies wat het doel is. Wellicht vraag je nu niet naar de oplossing van je probleem, maar naar de uitwerking van wat jij ziet als de oplossing van je probleem
1
2
3
4
5
6
7
8
9
10
<?php
$query
="select * from tabel;";
$result=pg_query($db,$query);
$lijst=pg_fetch_all($result);
$randomlijst=array_rand($lijst,count($lijst));
foreach(
$randomlijst as $randomitem)
{
   
//doe iets met $lijst[$randomitem];
}
?>

Dus als je hier niets aan hebt, zeg dan even wat je nou wilt ermee

[ Bericht 25% gewijzigd door Mappy op 22-10-2005 02:24:35 ]
rezjehzaterdag 22 oktober 2005 @ 02:18
domdomdom, hieronder goede

[ Bericht 97% gewijzigd door rezjeh op 22-10-2005 02:36:12 (lalalalala) ]
#ANONIEMzaterdag 22 oktober 2005 @ 02:22
Als je een random nummer gaat gebruiken loop je de kans dat je 2 of meerdere keren hetzelfde nummer krijgt he ? Mij lijkt het dat je gewoon vanaf 10 tot 1 telt en daarmee de database vult. Dus record 1 krijgt als waarde 10 etc..
Mappyzaterdag 22 oktober 2005 @ 02:22
Dat werkt niet rezjeh.
Als je echt wilt doen wat jzzpr vraagt, moet je een lijst van 1-10 randomizen en dan kijken of nergens geldt dat $lijst[n]==n. Indien wel, opnieuw beginnen. Kan natuurlijk, maar het lijkt me zo'n lelijke oplossing voor iets

En daarnaast moet je nog controleren of je niet van 2 -> 4 -> 2 -> 4 -> 2 gaat oid
#ANONIEMzaterdag 22 oktober 2005 @ 02:27
quote:
Op zaterdag 22 oktober 2005 02:22 schreef Mappy het volgende:
Dat werkt niet rezjeh.
Als je echt wilt doen wat jzzpr vraagt, moet je een lijst van 1-10 randomizen en dan kijken of nergens geldt dat $lijst[n]==n. Indien wel, opnieuw beginnen. Kan natuurlijk, maar het lijkt me zo'n lelijke oplossing voor iets

En daarnaast moet je nog controleren of je niet van 2 -> 4 -> 2 -> 4 -> 2 gaat oid
Waarom randomizen ? De enige eis is dat elk getal 1 keer gebruikt mag worden en het niet hetzelfde mag zijn als het record nummer.
Mappyzaterdag 22 oktober 2005 @ 02:29
quote:
Op zaterdag 22 oktober 2005 02:27 schreef gelly het volgende:
Waarom randomizen ? De enige eis is dat elk getal 1 keer gebruikt mag worden en het niet hetzelfde mag zijn als het record nummer.
quote:
jzzpr
Hoe kan ik dit met PHP helamaal random laten gebeuren?
Anders had ik ook wel voorgesteld om gewoon i+1 te nemen
#ANONIEMzaterdag 22 oktober 2005 @ 02:30
quote:
Op zaterdag 22 oktober 2005 02:29 schreef Mappy het volgende:

[..]


[..]
Ik begrijp eruit dat de TS denkt de getallen random toe te moeten wijzen terwijl dat m.i. helemaal niet nodig is.
rezjehzaterdag 22 oktober 2005 @ 02:32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
  $ar = array();
  for( $i = 1; $i <= 10; $i++ )
  {
    array_push( $ar, $i );
  }

  for( $i = 1; $i <= 10; $i++ )
  {
    $j = array_rand( $ar );
    unset( $ar[$j - 1] );

    $sql = "UPDATE tabel SET veld = '$j' WHERE id = '$i'";
    mysql_query( $sql );
  }
?>


ik zat met een dom hersenkronkel, dit bedoelde ik

gewoon oplopende array maken, daarna random cijfer uit die array, de inhoud ervan gebruiken om de table te updaten, daarna uit de array verwijderen. zo gebruik je niet 2 keer hetzelfde cijfer
Mappyzaterdag 22 oktober 2005 @ 02:32
quote:
Op zaterdag 22 oktober 2005 02:30 schreef gelly het volgende:
Ik begrijp eruit dat de TS denkt de getallen random toe te moeten wijzen terwijl dat m.i. helemaal niet nodig is.
Ik begreep eruit dattie ze random wil doorlopen en die volgorde kennelijk op wil slaan, maar ik wacht nog even op zijn uitleg...
#ANONIEMzaterdag 22 oktober 2005 @ 02:34
quote:
Op zaterdag 22 oktober 2005 02:32 schreef rezjeh het volgende:

[ code verwijderd ]

ik zat met een dom hersenkronkel, dit bedoelde ik

gewoon oplopende array maken, daarna random cijfer uit die array, de inhoud ervan gebruiken om de table te updaten, daarna uit de array verwijderen. zo gebruik je niet 2 keer hetzelfde cijfer
Als het random moet is deze manier het beste idd.
Mappyzaterdag 22 oktober 2005 @ 02:34
Dat werkt niet als hij de array wil doorlopen via deze variabele... Maar ik heb dus geen idee of jzzpr dat wil...
Want:
quote:
Op zaterdag 22 oktober 2005 02:22 schreef Mappy het volgende:
En daarnaast moet je nog controleren of je niet van 2 -> 4 -> 2 -> 4 -> 2 gaat oid
En daarnaast voldoet het ook mogelijk niet aan:
quote:
jzzpr
het nummer mag niet hetzelfde zijn als het ID van de record.
#ANONIEMzaterdag 22 oktober 2005 @ 02:41
edit

[ Bericht 99% gewijzigd door #ANONIEM op 22-10-2005 02:47:28 ]
rezjehzaterdag 22 oktober 2005 @ 03:02
quote:
Op zaterdag 22 oktober 2005 02:34 schreef Mappy het volgende:
Dat werkt niet als hij de array wil doorlopen via deze variabele... Maar ik heb dus geen idee of jzzpr dat wil...
Want:
[..]

En daarnaast voldoet het ook mogelijk niet aan:
[..]
dan doe je een while loopje met als $i == $j nog een keer proberen enzo, TS kan toch zelf ook wel wat doen
Mappyzaterdag 22 oktober 2005 @ 03:10
Dit zou wel werken voor jzzpr z'n probleem, maar hij reageert niet erg
1
2
3
4
5
6
7
8
9
$aantal=10;
$lijst=array();
for($i=1;$i++;$i<=$aantal)$lijst[]=$i;
shuffle($lijst);
for($i=0;$i++;$i<$aantal)
{
   $query="update tabel set nummer=".$lijst[($i+1)%$aantal]." where id=".$lijst[$i].";";
   $result=pg_query($db,$query);
}

(en de php-tag doet 't niet goed, dus maar even tussen gewone code-tags)
In elk geval een mooie oplossing gevonden voor jzzpr z'n probleem
(aangepast, nu met shuffle)

[ Bericht 5% gewijzigd door Mappy op 22-10-2005 16:13:42 ]
JeRazaterdag 22 oktober 2005 @ 03:26
*kuch*

[PHP/(My)SQL] voor dummies - Deel 14

Juist voor dit soort dingen is er bovenstaand topic
#ANONIEMzaterdag 22 oktober 2005 @ 03:31
quote:
Op zaterdag 22 oktober 2005 03:10 schreef Mappy het volgende:
Dit zou wel werken voor jzzpr z'n probleem, maar hij reageert niet erg
[ code verwijderd ]

(en de php-tag doet 't niet goed, dus maar even tussen gewone code-tags)
In elk geval een mooie oplossing gevonden voor jzzpr z'n probleem
Volgens mij pakt Array_rand willekeurige waarden uit een array, dus geen unieke waarden ?
Mappyzaterdag 22 oktober 2005 @ 03:39
quote:
Op zaterdag 22 oktober 2005 03:31 schreef gelly het volgende:
Volgens mij pakt Array_rand willekeurige waarden uit een array, dus geen unieke waarden ?
Dan doen we 't met shuffle(). Zie boven
#ANONIEMzaterdag 22 oktober 2005 @ 03:44
quote:
Op zaterdag 22 oktober 2005 03:39 schreef Mappy het volgende:

[..]

Dan doen we 't met shuffle(). Zie boven
$lijst[($i+1)\$aantal]

Mappyzaterdag 22 oktober 2005 @ 10:24
quote:
Op zaterdag 22 oktober 2005 03:44 schreef gelly het volgende:
$lijst[($i+1)\$aantal]
Je kent de modulo-operator niet? Da's een "%".
Of begrijp je niet wat ik ermee wil?

[ Bericht 3% gewijzigd door Mappy op 22-10-2005 16:15:34 (\=%) ]
SuperRembozaterdag 22 oktober 2005 @ 11:25
quote:
Op zaterdag 22 oktober 2005 10:24 schreef Mappy het volgende:

[..]

Je kent de modulo-operator niet? Da's een "\".
Je haalt PHP en VB door elkaar.
Sanderzaterdag 22 oktober 2005 @ 11:26
quote:
Op zaterdag 22 oktober 2005 03:26 schreef JeRa het volgende:
*kuch*

[PHP/(My)SQL] voor dummies - Deel 14

Juist voor dit soort dingen is er bovenstaand topic
Het hoeft niet allemaal speciaal in één topic .
vbmotzaterdag 22 oktober 2005 @ 12:07
Misschien begrijp ik je verkeerd, maar is het niet makkelijker om het veld in de DB een auto_increment flag te geven. Als je vervolgens een record naar de DB schrijft laat je het id veld open. De DB manager zorgt er dan voor dat de waarde uit het vorige_id_veld+1 in het id veld wordt ingevuld.

Random numbers hebben de nare eigenschap dat ze random zijn (eigenlijk pseudo-random) en dat betekent dus dat je in theorie ook dubbele getallen kunt krijgen.
Mappyzaterdag 22 oktober 2005 @ 16:14
quote:
Op zaterdag 22 oktober 2005 11:25 schreef SuperRembo het volgende:
Je haalt PHP en VB door elkaar.
En ik programmeer niet eens in VB "%" dus

BTW, waar is TS?
Wolfjezaterdag 22 oktober 2005 @ 18:08
Mappy heeft volkomen gelijk. Alle andere methodes hebben volgens mij de eigenschap dat het voor kan komen dat een record zijn eigen id als nummer krijgt, hetgeen strijdig is met de voorwaarde.

Dat Mappy wél gelijk heeft kun je het beste inzien door de getalletjes in random volgorde in een kringetje te plaatsen. Het nummer van record met id x is gelijk aan de rechter buur van x in dit kringetje. Zo weet je zeker dat het id altijd verschilt van het nummer.

Voor het geval de topic starter er wat aan heeft: de wiskundige kreet die hierbij hoort is 10-cykel .