fonction rand sur un tableau

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : fonction rand sur un tableau

par joboy84 » 09 oct. 2008, 16:04

Ok je change ca :D

En tout cas merci encore...!

par Hywan » 09 oct. 2008, 15:53

Maintenant, tu vas juste m'enlever ses balises <font> et <b> que tu vas remplacer par un style CSS et <strong>, tu seras gentil ;-).
Tu penseras aussi à mettre le sujet en résolu.

Et bravo :).

par joboy84 » 09 oct. 2008, 15:46

Hello,

Alors je m'étais d'abord lancé dans une boucle while...pour ajouter les mots dans le tableau...

Puis après avoir vu le post de jojolapine, cela m'a bien aidé!

Il y avait 2 ou 3 choses que j'ai corrigées mais cela fonctionne maintenant...

Encore un grand merci à vous pour votre aide: je n'aurai jamais pensé réussir à aller aussi loin...Comme quoi avec de la volonté et un petit coup de pouce, on arrive à bout de tout!

Voici le code final:
<?php

$alphabet = range('a', 'z'); 
$language = null; 
$texte = null;
$textefinal = null;

//On génère entre 100 et 500 mots
for($e = 0, $words = rand(100, 500); $e < $words; $e++) 
{ 
    //Un mot contient entre 2 et 10 caracteres
    for($i = 0, $length = rand(2, 10); $i < $length; $i++)  
        $language .= $alphabet[array_rand($alphabet)]; 

    $language .= ' '; 
} 

$tableau = array(
    '<font color=red><b>soleil</b></font>',
    '<font color=red><b>argent</b></font>',
    '<font color=red><b>partir vacances</b></font>',
     ); 

$pourcent = round($words*0.05); 

$dico=array();

for($fix=0;$fix<$pourcent;$fix++)
{
    $dico[]=$tableau[array_rand($tableau)];
} 

// On explose l'array pour récupérer les mots
$texteEntier_explode = explode(' ', trim($language)); 

//On fusionne les 2 tableaux
$list = array_merge($texteEntier_explode, $dico);

// On mélange les mots
shuffle($list); 

// On recoupe chaque mot séparé d'un espace
$texteFinal = implode(' ', $list); 

echo "$texteFinal";

?> 

par jojolapine » 09 oct. 2008, 15:43

mais euh....
pardon :oops: je ferais plus (un petit x 100 et ça marche non?)

par Hywan » 09 oct. 2008, 15:35

Ton exemple ne produira aucun résultat car tu incrémentes ton $i de 1, alors qu'on travaille sur un nombre inférieur à 1.

Laisse faire notre ami, la solution n'est pas compliquée :).

par jojolapine » 09 oct. 2008, 15:27

Alors il suffit de modifier la fin de son script, à savoir:
/**
 * Nos mots donnés.
 */
$given = array(
    'phpfrance',
    'super',
    'génial',
    'top',
    'déchire'
);

/**
 * On ajoute nos mots à ceux du langage.
  */
$result = array_merge($language, $given);

/**
 * On mélange le tout …
 */
shuffle($result);

/**
 * Et on reconstruit la phrase.
 */
var_dump(implode(' ', $result)); 
en
/**
 * Nos mots donnés.
 */
$given = array(
    'phpfrance',
    'super',
    'génial',
    'top',
    'déchire'
);

/**
*  Le tableau de mots proportionnel à leur pourcentage
*/
//nombre de mots à prendre dans le "dictionnaire"
$pourcent = round(count($language)*0.05); 
$dico=array();
for($i=0;$i<$pourcent;$i++){
    $dico[]=$given[array_rand($given)];
}

/**
 * On ajoute nos mots à ceux du langage.
  */
$result = array_merge($language, $dico);

/**
 * On mélange le tout …
 */
shuffle($result);

/**
 * Et on reconstruit la phrase.
 */
var_dump(implode(' ', $result)); 
Et hop!
attention, code non testé, mais l'idée est là ;)

edit:
Bah ici, j'ai créé le tableau manuellement. Génère le dynamiquement Smile.
ben voilà, à peu près comme ça ;)

par Hywan » 09 oct. 2008, 15:22

Bah ici, j'ai créé le tableau manuellement. Génère le dynamiquement :).

par joboy84 » 09 oct. 2008, 15:16

Sa solution affichera la même chose que ce que j'ai actuellement, à savoir, chaque "mot fixe" une seul est unique fois.

Ce que je voudrais, c'est que cela affiche les mots fixes le nombre de fois que le chiffre contenu dans $pourcent. :roll:

par jojolapine » 09 oct. 2008, 14:54

Qu'est-ce que tu veux dire par "ta solution ne donnera pas ce que je veux.."? dévellope un peu...

par joboy84 » 09 oct. 2008, 14:05

Oui je me suis bien cassé la tête :lol:

Par contre ta solution ne fera pas ce que je veux...

Voila le code actuel au dernier stade:
<?php

$alphabet = range('a', 'z'); 
$language = null; 
$texte = null;
$textefinal = null;

//On génère entre 100 et 500 mots
for($e = 0, $words = rand(100, 500); $e < $words; $e++) 
{ 
    //Un mot contient entre 2 et 10 caracteres
    for($i = 0, $length = rand(2, 10); $i < $length; $i++)  
        $language .= $alphabet[array_rand($alphabet)]; 

    $language .= ' '; 
} 
$pourcent = round($words*0.05);

//Génère les mots fixe x fois (correspondant aux 5%)
for($fix = 0; $fix < $pourcent; $fix++) 
{
//mots fixe
$tableau = array("<font color=red><b>soleil</b></font>", "<font color=red><b>argent</b></font>", "<font color=red><b>partir vacances</b></font>");
//$texte .= $tableau[array_rand($tableau)];
//$texte .= ' '; 
}

// On explose l'array pour récupérer les mots
$texteEntier_explode = explode(' ', trim($language)); 

//On fusionne les 2 tableaux
$list = array_merge($texteEntier_explode, $tableau);

// On mélange les mots
shuffle($list); 

// On recoupe chaque mot séparé d'un espace
$texteFinal = implode(' ', $list); 

echo "$texteFinal";

?> 
Ce qui me donne: http://www.voilou.fr/testmot.php

Les mots en rouge sont les "mots fixes". Ils n'apparaissent qu'une seule fois car j'ai commenté les variables $texte que je n'ai pas utilisés. En décommentant, cela ajoutera bien le nombre de mots fixes voulus dans la variable $texte...Par contre je ne sais pas comment intégrer ceux ci dans le texte.

Voila... :roll:

Merci encore.. :D

par Hywan » 09 oct. 2008, 13:48

Bien, tu t'es cassé la tête maintenant ;-).
Tu n'es pas loin de la solution pourtant.

Imagine que ta phrase est un tableau de mot. Au lieu de concaténer les mots, on les place dans un tableau dynamiquement. Ensuite, on ajoute des mots au tableau (nos mots fixés, donnés), et on mélange le tout avec shuffle() ?

Ainsi, on aurait :
<?php

/**
 * On crée notre alphabet et notre langage.
 * Notre langage est un tableau de mot.
 */
$alpha    = range('a', 'z');
$language = array();

for($e = 0, $words = rand(5, 23); $e < $words; $e++) {

    /**
     * Cette variable contient notre mot (qui sera la
     * concaténation de lettres).
     */
    $handle = null;

    for($i = 0, $length = rand(2, 10); $i < $length; $i++)
        $handle .= $alpha[array_rand($alpha)];

    /**
     * On ajoute notre mot à notre langage.
     */
    $language[] = $handle;
}

/**
 * Nos mots donnés.
 */
$given = array(
    'phpfrance',
    'super',
    'génial',
    'top',
    'déchire'
);

/**
 * On ajoute nos mots à ceux du langage.
  */
$result = array_merge($language, $given);

/**
 * On mélange le tout …
 */
shuffle($result);

/**
 * Et on reconstruit la phrase.
 */
var_dump(implode(' ', $result));
Tu avais tous les éléments en main. L'idée du shuffle() était bonne. En revanche, tu découpais ton langage (ta phrase) en tableau, alors tu pouvais directement le construire sous forme de tableau (et le transformer en chaîne derrière). Cela évite ton problème des mots donnés avec espace.

T'as compris ?

par joboy84 » 08 oct. 2008, 15:45

En fait je souhaite ajouter ces mots à des endroits non prédéfinis, dans le texte généré. Donc à un endroit au hasard, sans pour autant que 2 mots "fixes" puissent se suivre ou précéder.

Voila ce que j'ai fait pour le moment, en ayant cogité sur le sujet toute la journée:
<?php

$alphabet = range('a', 'z'); 
$language = null; 

//On génère entre 100 et 500 mots
for($e = 0, $words = rand(100, 500); $e < $words; $e++) 
{ 
    //Un mot contient entre 2 et 10 caracteres
    for($i = 0, $length = rand(2, 10); $i < $length; $i++)  
        $language .= $alphabet[array_rand($alphabet)]; 

    $language .= ' '; 
} 
$pourcent = round($words*0.05);

echo $language; 

//Génère les mots fixe x fois (correspondant aux 5%)
for($fix = 0; $fix < $pourcent; $fix++) 
{
//mots fixe
$tableau = array('gagné', 'perdu', 'rejouer');
$motfixe = array_rand($tableau, 2);
echo ''.$tableau[$motfixe[0]].' ';
}
?> 
La première partie génère les mots et le texte. La seconde partie génère le nombre adéquat de "mots fixes".

Par contre après je cale vraiment, je ne vois pas où insérer le code de la seconde partie, dans la première, afin que les mots soient ajoutés au texte...

EDIT 5eme fois...:

J'ai essayé également en faisant:
<?php

$alphabet = range('a', 'z'); 
$language = null; 
$texte = null;
$textefinal = null;

//On génère entre 100 et 500 mots
for($e = 0, $words = rand(100, 500); $e < $words; $e++) 
{ 
    //Un mot contient entre 2 et 10 caracteres
    for($i = 0, $length = rand(2, 10); $i < $length; $i++)  
        $language .= $alphabet[array_rand($alphabet)]; 

    $language .= ' '; 
} 
$pourcent = round($words*0.05);

//echo $language; 

//Génère les mots fixe x fois (correspondant aux 5%)
for($fix = 0; $fix < $pourcent; $fix++) 
{
//mots fixe
$tableau = array("<b>soleil</b>", "<b>argent</b>", "<b>partir vacances</b>");
$texte .= $tableau[array_rand($tableau)];
$texte .= ' '; 
}

//On fusionne les 2 textes
$texteEntier = ''.$language.' '.$texte.' ';

//Si ici je fais un echo, cela affiche le texte entier, avec les mots fixes listés à la fin.
//echo "<font color=red>$texteentier</font>";

// On explose l'array pour récupérer les mots
$texteEntier_explode = explode(' ', trim($texteEntier)); 

// On mélange les mots
shuffle($texteEntier_explode); 

// On recoupe chaque mot séparé d'un espace
$texteFinal = implode(' ', $texteEntier_explode); 

echo "<font color=red>$texteFinal</font>";

?>  
Donc cela fonctionne plus ou moins ainsi...Il y a tout de même un problème...

Si je mets en mot fixe un seul mot, comme par exemple "soleil", cela me dispercera bien le mot n'importe où dans le texte. Par contre il y a un problème avec les mots composés comme "partir vacances". En effet, lorsque le script va tout mélanger, il va faire comme si "partir" et "vacances" étaient 2 mots distincts...et je voudrais qu'ils ne constituent qu'un mot.

Exemple:

Cela affiche: nvxdrr setrndzdv partir lgo lpqt gnjf licrbe vacances wmnrv
Et je voudrais que cela affiche: nvxdrr setrndzdv partir vacances lgo lpqt gnjf licrbe wmnrv

RE edit:

Voila j'ai réussi à tout fusionner et a afficher les mots fixes tels quel, mais ils ne sont pas mélangés car ils sont contenus dans un seul $string
<?php
for($fix = 0; $fix < $pourcent; $fix++) 
{
//mots fixe
$tableau = array("<b>soleil</b>", "<b>argent</b>", "<b>partir vacances</b>");
$texte .= $tableau[array_rand($tableau)];
$texte .= ' '; 
}

$tabfinal = array($texte);

// On explose l'array pour récupérer les mots
$texteEntier_explode = explode(' ', trim($language)); 

//On fusionne les 2 tableaux
$list = array_merge($texteEntier_explode, $tabfinal);

// On mélange les mots
shuffle($list); 

// On recoupe chaque mot séparé d'un espace
$texteFinal = implode(' ', $list); 

echo "<font color=red>$texteFinal</font>";

?> 
Bref, après une journée et une nuit de cogitation, j'en suis la... :roll:

J'ai tout de même quelqu'un qui m' a aidé pour la partie mélange, notemment avec la fonction shuffle.

Svp aidez moi! |*()

merci encore...

par Hywan » 08 oct. 2008, 15:21

Hmm, dans la première boucle, tu auras une condition : si on doit écrire un mot, on l'ajoute, sinon on le génère automatiquement. Pour savoir si on doit écrire un mot, tu utilises les pourcentages d'apparition. Là, plusieurs solutions : soit tu comptes le nombre de mot déjà écrit, et tu en places un à des emplacements fixes. Ou sinon … hmm, tu as vraiment plusieurs solutions. Tu peux t'amuser avec les positions, les modulo, et des fréquences d'apparition, tout dépend de ce que tu veux faire exactement.

Donc dans la première boucle : une condition. Cette condition donne sur un ajout simple de mot, ou sur la boucle de génération de mot.

Allé, je te passe le clavier :).

par joboy84 » 08 oct. 2008, 15:13

Re ! :D

Alors voila, je suis un peu bloqué...

Voici le code qui génère donc le texte et les mots:
<?php

$alphabet = range('a', 'z'); 
$language = null; 
//On génère entre 100 et 500 mots
for($e = 0, $words = rand(100, 500); $e < $words; $e++) 
{ 
    //Un mot contient entre 2 et 10 caracteres
    for($i = 0, $length = rand(2, 10); $i < $length; $i++)  
        $language .= $alphabet[array_rand($alphabet)]; 

    $language .= ' '; 
} 

echo $language; 
?>
Maintenant, en supposant que je voudrai qu'un mot précis soit introduit à des endroits au hasard dans le texte, en sachant que celui ci doit apparaitre pour l'équivalent de 5% du texte entier... |*()

En gros, voila ce que j'ai fait:
<?php
//Les mots doivent apparaitre x fois dans le texte, x correspondant à 5% du nombre de mots 
$pourcent = $words*0.05;

//mots fixe
$tableau = array('jeux', 'jeux en ligne', 'jeux gratuits');
$motfixe = array_rand($tableau, 2);

echo $tableau[$motfixe[0]];

?>
Cela fonctionne bien, un mot est tiré au hasard du tableau. La variable pourcent contient le nombre de fois que le mot doit apparaitre.

Par contre je cale, ou dois je introduire cette condition et comment? Dans la première ou seconde boucle FOR? Dois je créer une nouvelle boucle? (if? while? for?)

Merci

par Hywan » 08 oct. 2008, 14:17

Ah oui mince, je suis tête en l'air …
$alpha    = range('a', 'z'); 
$language = null; 

for($e = 0, $words = rand(5, 23); $e < $words; $e++) { 

    for($i = 0, $length = rand(2, 10); $i < $length; $i++) 
        $language .= $alpha[array_rand($alpha)]; 

    $language .= ' '; 
} 

var_dump($language);
Je ne teste pas tous les codes hein ;-).