Page 1 sur 1

Exclusion d'un nombre aléatoire

Posté : 20 févr. 2013, 22:03
par mctarek
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

Re: Exclusion d'un nombre aléatoire

Posté : 21 févr. 2013, 01:13
par niuxe
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);

Re: Exclusion d'un nombre aléatoire

Posté : 22 févr. 2013, 00:20
par Perine
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);


Re: Exclusion d'un nombre aléatoire

Posté : 22 févr. 2013, 21:41
par niuxe
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>";