Exclusion d'un nombre aléatoire

Eléphanteau du PHP | 43 Messages

20 févr. 2013, 22:03

Bonjour.
Je me trouve devant une situation qui a l'air simple, mais dont je ne parviens pas
à trouver le bon code pour un résultat fiable.

Voici mon besoin. Je souhaite générer un nombre aléatoire mais qui ne fait pas parti d'un tableau
$table = array(1,3,5,7,9);
function gen_nb() {	
return mt_rand(0,10);
}

$tabkeys = array(); // tableau des nombres à trouver

while (!in_array($nb = gen_nb(),$table)) {
	array_push($tabkeys,$nb);
	}
	
	var_dump($tabkeys);
	
	// retourne par exemple array(4) { [0]=> int(8) [1]=> int(2) [2]=> int(6) [3]=> int(10) } 
	// soit array(1) { [0]=> int(0) } 
	// soit array(0) { } 
Comment faire pour un obtenir à coup sûr une liste de résultats fiable ?
Merci de votre aide.
mctarek

Eléphant du PHP | 453 Messages

21 févr. 2013, 01:13

Salut,
<?php
	$table = array(1,3,5,7,9);
	$tabkeys = array();
	
	for($i = 0;$i <= 10;$i++){
		if(!in_array($i,$table)){
			$tabkeys[] = $i;
		}
	}
	var_dump($tabkeys);
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Eléphant du PHP | 120 Messages

22 févr. 2013, 00:20

la solution de niuxe n'a rien d'aléatoire. Mais malheureusement, je ne comprends pas selon quel critère la fonction en question devrait renvoyer 4, 1 ou 0 nombres.
En admettant que le nombre de résultats est aussi aléatoire :
$table = array(1,3,5,7,9);
function get_random_values(array &$disallowed, &$random_values) {
	$random_values = array();
	$new_size = mt_rand(0, 11 - count($disallowed));
	while (count($random_values) !== $new_size) {
		$random = mt_rand(0, 10);
		if (!in_array($random, $disallowed, true) && !in_array($random, $random_values, true)) {
			$random_values[] = $random;
		}
	}
}
get_random_values($table, $random_values);
var_dump($random_values);


Eléphant du PHP | 453 Messages

22 févr. 2013, 21:41

la solution de niuxe n'a rien d'aléatoire.
+1
Mais malheureusement, je ne comprends pas selon quel critère la fonction en question devrait renvoyer 4, 1 ou 0 nombres.
En admettant que le nombre de résultats est aussi aléatoire :
$table = array(1,3,5,7,9);
function get_random_values(array &$disallowed, &$random_values) {
	$random_values = array();
	$new_size = mt_rand(0, 11 - count($disallowed));
	while (count($random_values) !== $new_size) {
		$random = mt_rand(0, 10);
		if (!in_array($random, $disallowed, true) && !in_array($random, $random_values, true)) {
			$random_values[] = $random;
		}
	}
}
get_random_values($table, $random_values);
var_dump($random_values);

-10 ! Pourquoi ? Largement moins performant. Sur un petit tableau, ça ne se voit pas. Plus le tableau grossit plus le script va demander des ressources pour rien. Dans mon script j'ai juste oublié de mettre une fonction :
$table = array(1,3,5,7,9);
$tabkeys = array();
       
        for($i = 0;$i <= 10;$i++){ //Le souci est en fait de connaître quelle est la valeur max.
                if(!in_array($i,$table)){
                        $tabkeys[] = $i;
                }
        }
        shuffle($tabkeys);
	echo "<pre>";
	
	var_dump($tabkeys);
	echo "</pre>";
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia