[RESOLU] erreur function rand

Eléphant du PHP | 417 Messages

16 janv. 2013, 17:57

bonjour a tous le monde,

voila je cherche a faire un petit script qui me choisira 5 nums entre 1 et 1000 ( inclus)

mon script marche bien mais 1/5 il me donne moins que 5 numéros (des fois 4 nums, 3, 2 ou même un num des fois)

sachant que un nombre ne doit pas être choisi de fois

donc je procède d'abord par créer un tableau dans lequel je stock mes nums
je verifie a chaque rand si le chiffre choisi par la function n'est pas déjà dans le tableau ou si la case numéro 4 (c'est à dire le 5eme numéro) est vide

voici comment je procède

$nums = array();

while (!in_array($jok = rand(1, 50), $nums) and (!isset($nums[4])))
$nums[] = $jok;

foreach ($nums as $value) {
	echo $value.' / ';
}

Eléphant du PHP | 267 Messages

16 janv. 2013, 18:51

salut,

voici le code :
<?php
$tab = range(1, 50);
$rand = array_rand($tab, 5);
$nums = array();
foreach($rand as $val) {
    $nums[] = $tab[$val];
}
print_r($nums);
@+
dix2

Eléphant du PHP | 417 Messages

17 janv. 2013, 01:14

merci pour votre réponse,

mais est ce que c'est normal que range(1, 50) me donne un 0 aussi ? alors qu'il est pas dans l'intervalle

Eléphant du PHP | 267 Messages

17 janv. 2013, 01:22

le 0 que tu vois, c'est la clef de la 1ère valeur
mais dans l'intervalle des valeurs, il n'y a pas de 0

Eléphant du PHP | 417 Messages

17 janv. 2013, 09:58

Non Non je te rassure que ce n'est pas le num de la première case de tableau

voici résultats :

Array ( [0] => 0 [1] => 2 [2] =>5 [3] => 17 [4] => 19 [5] => 21 [6] => 22 [7] => 28 [8] => 29 [9] => 46 )

en fait j'ai supprimé une partie de ton code qui est juste rajouter et qui sert a rien a mon avis voici la partie que j'ai supprimé
$nums = array();
foreach($rand as $val) {
$nums[] = $tab[$val];
}
j'ai pas compris pourquoi tu as ajouté cette boucle vu que tu transmet juste un tableau dans un autre donc au final tu as deux tableaux qui contient la même chose non ?

EDIT /////////////

Ah non j'ai pas même résultats dans les deux tableaux

les valeurs de 2eme tableau égale les valeurs de première tableau + 1 d'ou ça vien le +1 ?

Array ( [0] => 0 [1] => 4 [2] => 8 [3] => 27 [4] => 29 [5] => 35 [6] => 39 [7] => 44 [8] => 47 [9] => 49 ) // ça c'est le tableau $rand
Array ( [0] => 1 [1] => 5 [2] => 9 [3] => 28 [4] => 30 [5] => 36 [6] => 40 [7] => 45 [8] => 48 [9] => 50 ) // et celui la c'est $nums

bon je recommence pour voir c'est j'ai bien compris ton code :
$tab = range(1, 50); // cette ligne me crée un tableau qui contient tous les nums de 1 a 50 genre $tab = array (1, 2,3,4,5,6,7,8,9,10,11,12....,50); 
$rand = array_rand($tab, 10);// cette ligne me choisi 10 nums au hasard dans le tableau $tab c'est à dire 10 nums de l'intervalle [1,50] (le 1 et 50 inclus ) dans notre cas
$nums = array();

// la boucle suivante prend la valeur de $tab[0] et le met dans $nums[0] ect... non ?
foreach($rand as $val) {
$nums[] = $tab[$val];
}

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

17 janv. 2013, 11:53

salut,

ce qu'il te manque dans l'histoire c'est que array_rand ne retourne pas les valeur mais les clefs du tableau.

le foreach permet d'avoir les valeur sélectionnés.

donc quand tu vois 0 c'est l'index du tableau $tab (qui contient la valeur 1 ;) )

tu peux aussi le faire avec des fonction native suffleet array_slice

par exemple
<?php
$tab = raneg(1,50);
suffle($tab);
$nums = array_slice($tab,0,10); // tu peux aussi te dire que commence au milieu du tableau en remplaçant 0 par 25 c'est pareil
?>
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 417 Messages

17 janv. 2013, 12:29

salut,

ce qu'il te manque dans l'histoire c'est que array_rand ne retourne pas les valeur mais les clefs du tableau.
Voila j'ai pas fait attention a ça :) ^^ merci à vous deux :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

17 janv. 2013, 13:29

de rien :)

peut tu cliquer sur le bouton résolu ? :mrgreen:

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 417 Messages

17 janv. 2013, 14:57

de rien :)

peut tu cliquer sur le bouton résolu ? :mrgreen:

@+
c'est fait :)