Random nummers
De combinatie van nummers moet altijd uniek zijn. Iemand een idee?
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$arr = range(0, 99);
$rand_keys = array_rand($arr, 6);
foreach($rand_keys as $key)
echo $arr[$key] . "\n";
?>
$arr = range(0, 99);
$rand_keys = array_rand($arr, 6);
foreach($rand_keys as $key)
echo $arr[$key] . "\n";
?>
In jouw voorbeeld kan dat wel. Hoe kan ik dat oplossen?
Jij zegt nu dat er wel dubbele in mogen voorkomen maar alleen geen zes dezelfde.
In dat geval zou ik beginnen met de gewone rand() functie. en als laatste een controle inbouwen die checkt of ze niet allemaal hetzelfde zijn (0.00001 % kans). Mocht dat voorkomen dan gewoon nog een keertje proberen..
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
do
{
// lege array
$arr = array();
// pak zes keer een random waarde en zet die in een array
for($i = 0 ; $i < 6 ; $i++)
$arr[] = rand(0, 99);
// er moeten minimaal twee verschillende getallen in de array aanwezig zijn.
// zo niet begin dan weer van voor af aan
} while(count(array_unique($arr)) < 2);
// laat het resultaat zien:
foreach($arr as $num)
{
echo $num . '<br>';
}
?>
do
{
// lege array
$arr = array();
// pak zes keer een random waarde en zet die in een array
for($i = 0 ; $i < 6 ; $i++)
$arr[] = rand(0, 99);
// er moeten minimaal twee verschillende getallen in de array aanwezig zijn.
// zo niet begin dan weer van voor af aan
} while(count(array_unique($arr)) < 2);
// laat het resultaat zien:
foreach($arr as $num)
{
echo $num . '<br>';
}
?>
Gewijzigd op 13/09/2014 13:07:01 door Frank Nietbelangrijk
Frank Nietbelangrijk op 13/09/2014 13:06:46:
In mijn voorbeeld zijn het ALTIJD zes verschillende nummers. er zit dus NOOIT een dubbele in.
Jij zegt nu dat er wel dubbele in mogen voorkomen maar alleen geen zes dezelfde.
Jij zegt nu dat er wel dubbele in mogen voorkomen maar alleen geen zes dezelfde.
Dat klopt! Het moeten 6 verschillende cijfers zijn in een reeks van 1 t/m 99. Stel ik voer dit 100 keer uit, mag het NIET voorkomen dat ik een reeks krijg met daarin 6 dezelfde nummers als de voorgaande reeks. Wel mogen er 5 dezelfde cijfers in voorkomen, als er maar minimaal 1 afwijkt. Het moet dus een unieke reeks zijn, waarbij een cijfer (bijvoorbeeld 3) in meerdere reeksen mag voorkomen, als de combinate van de reeks maar nooit hetzelfde is.
Gewijzigd op 13/09/2014 13:18:34 door Roy B
Toevoeging op 13/09/2014 13:41:38:
Quote:
Dat klopt! Het moeten 6 verschillende cijfers zijn in een reeks van 1 t/m 99. Stel ik voer dit 100 keer uit, mag het NIET voorkomen dat ik een reeks krijg met daarin 6 dezelfde nummers als de voorgaande reeks. Wel mogen er 5 dezelfde cijfers in voorkomen, als er maar minimaal 1 afwijkt. Het moet dus een unieke reeks zijn, waarbij een cijfer (bijvoorbeeld 3) in meerdere reeksen mag voorkomen, als de combinate van de reeks maar nooit hetzelfde is.
Dat doet mijn voorbeeld nu
Gewijzigd op 13/09/2014 13:20:08 door Frank Nietbelangrijk
Roy B op 13/09/2014 10:37:57:
Ik zoek een manier om 6 random nummers uit een array van 1 t/m 99 te genereren.
De combinatie van nummers moet altijd uniek zijn.
De combinatie van nummers moet altijd uniek zijn.
Op basis hiervan lijkt het alsof de 6 nummers uniek moeten zijn.
Roy B op 13/09/2014 12:00:00:
De reeks mag nooit 6 dezelfde nummers bevatten, maar wel 5 dezelfde en 1 andere bijvoorbeeld.
Nu gaat het om een reeks van 6 cijfers, waarbij niet elk getal uniek hoeft te zijn.
Roy B op 13/09/2014 13:18:14:
Het moeten 6 verschillende cijfers zijn in een reeks van 1 t/m 99. Stel ik voer dit 100 keer uit, mag het NIET voorkomen dat ik een reeks krijg met daarin 6 dezelfde nummers als de voorgaande reeks.
En nu gaat het in eens om 100x een 6-cijferig getal die ten opzichte van elkaar uniek moeten zijn.
Roy B op 13/09/2014 13:18:14:
Wel mogen er 5 dezelfde cijfers in voorkomen, als er maar minimaal 1 afwijkt. Het moet dus een unieke reeks zijn, waarbij een cijfer (bijvoorbeeld 3) in meerdere reeksen mag voorkomen, als de combinate van de reeks maar nooit hetzelfde is.
Maar mag die drie nu wel of niet meerdere keren voorkomen in die 6 cijfers?
De ene keer heb je het namelijk over iets van 6 cijfers dan weer over reeksen.
Als je het gaat om 100x een uniek getal van 6 (al dan niet) unieke cijfers, gaat de oplossing van Frank volgens mij niet werken; die controleert alleen of er minimaal twee verschillende waarden zitten in de 6 cijfers. Niet die 100.
De combinatie van de 6 cijfers mag nooit hetzelfde zijn. Een voorbeeld kan dus zijn 3, 16, 62, 36, 80, 1.
Alle daarop volgende combinaties mogen wel 1 of meerdere dezelfde cijfers bevatten, maar nooit alle 6. De combinatie van de cijfers moet ten alle tijde afwijkend zijn en mag dus maar 1 keer voorkomen.
Dan moet je de reeds gekozen series gaan onthouden (database).
Mogen de getallen gesorteerd worden? jouw voorbeeld zou dan worden: 1 3 16 36 62 80
De volgorde maakt niet uit, zolang de combinatie van cijfers altijd uniek is.
Gedurende hoelang?
Mag bijv. na 10x weer wel dezelfde serie voorkomen? En hoe vaak ga je een "trekking" doen? Meerdere keren per dag, of bijv. 1x per maand?
1x per maand
Je zou dan zoals Frank al hintte de getallen op volgorde kunnen zetten met een spatie ertussen, en die string opslaan in de database. Als je dan een nieuwe "trekking" doet, maak je weer zo'n string. Als die string al voorkomt in de database, doe je de trekking overnieuw net zolang totdat je een unieke string hebt. Die sla je dan weer op in de database... enz.
2-15-33-33-46-83
Mag dit nu met die dubbele 33 Ja of Nee ?
Dus 5 dezelfde cijfers zou mogen, maar niet alle 6, omdat de combinatie dan niet meer uniek is.
>> Dus 5 dezelfde cijfers zou mogen...
Juist...
Goede specificaties schrijven is een vak apart. ;-) Maar wel ontzettend belangrijk; dat zie je al als je dit draadje doorleest...
Ik gok dat er bedoeld wordt:
1) Een getallenreeks bestaat uit 6 willekeurige getallen tussen 1 en 99 (inclusief).
2) Alle getallen binnen een getallenreeks zijn uniek.
3) Een getallenreeks verschilt met minimaal 1 getal van alle andere getallenreeksen.
Overigens wordt in de eerdere postings ook het woord 'cijfer' vaak verkeerd gebruikt. Een cijfer is een getal tussen 0 en 9 (inclusief); een getal is samengesteld uit een of meerdere cijfers en eventueel een komma.
Ik heb een demo in elkaar geflanst:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
function getNewUniqueCombination($existingCombinations = array())
{
$arr = array_fill(1, 99, NULL);
//print_r($arr);
do
{
// Uhm.. it works! :p
$str = implode('-', array_rand($arr, 6));
} while(in_array($str, $existingCombinations)); // als we deze combinatie al hadden dan beginnen we opnieuw
return $str;
}
// DEMO
// begin met een lege array
$existingCombinations = array();
// we gaan 100x een combinatie maken die nog niet voorkomt
for($i = 0 ; $i < 100 ; $i++)
{
// nieuwe trekking :-)
$newCombination = getNewUniqueCombination($existingCombinations);
// laat maar zien wat we hebben
echo $newCombination . '<br>';
// voeg de nieuwe trekking toe aan de array (van bestaande combinaties)
$existingCombinations[] = $newCombination;
}
// nog even een testje of we wel echt 100 verschillende combinaties hebben
echo count(array_unique($existingCombinations));
?>
function getNewUniqueCombination($existingCombinations = array())
{
$arr = array_fill(1, 99, NULL);
//print_r($arr);
do
{
// Uhm.. it works! :p
$str = implode('-', array_rand($arr, 6));
} while(in_array($str, $existingCombinations)); // als we deze combinatie al hadden dan beginnen we opnieuw
return $str;
}
// DEMO
// begin met een lege array
$existingCombinations = array();
// we gaan 100x een combinatie maken die nog niet voorkomt
for($i = 0 ; $i < 100 ; $i++)
{
// nieuwe trekking :-)
$newCombination = getNewUniqueCombination($existingCombinations);
// laat maar zien wat we hebben
echo $newCombination . '<br>';
// voeg de nieuwe trekking toe aan de array (van bestaande combinaties)
$existingCombinations[] = $newCombination;
}
// nog even een testje of we wel echt 100 verschillende combinaties hebben
echo count(array_unique($existingCombinations));
?>
Gewijzigd op 16/09/2014 12:28:03 door Frank Nietbelangrijk