8
votes

Challenge de génération PHP Array

J'ai besoin de générer au hasard un réseau N bidimensionnel N par N. Dans cet exemple, n = 10. Le tableau doit avoir cette structure. Un exemple: xxx

xxx

Comme vous le voyez, c'est comme une matrice de chiffres, chaque ligne de celui-ci et colonne consistent également à partir de numéros 0 -9, et il n'y a jamais un numéro deux fois dans chaque rangée ou dans chaque colonne. Comment générer un tel tableau et chaque fois de manière aléatoire.


3 commentaires

Désolé rien . Juste lors de la copie et du traduit d'un autre forum, j'ai oublié de le supprimer


Vous voulez dire un solveur / générateur Sudoku?


Ce n'est en fait pas Sudoku. Il s'agit de 10 questions qui doivent être affectées à 10 personnes de manière à ce que l'absence de 2 personnes n'atteigne la même question au même niveau. Sudoku Table of Nombres fera, mais sans règne que dans chaque bloc de 3x3, nous devrions aussi avoir 1-9 ....


3 Réponses :


2
votes

C'est ce que j'ai fait. Fait une matrice valide (matrice 2D) qui n'est pas aléatoire. Donc, la rangée 0 est 0-9, la rangée 1 est 1-0 (c'est-à-dire: 1,2,3 ... 8,9,0), la rangée 2 est 2-1 (2,3 ... 9, 0,1) ... la rangée 8 est 8-7 ... etc. Puis mélangez ce tableau pour randomiser les lignes et effectuez une simple échange de colonne pour randomiser les colonnes. Devrait revenir exactement ce que vous voulez. Essayez ceci:

<?php
//simple function to show the matrix in a table.
function show($matrix){
    echo '<table border=1 cellspacing=0 cellpadding=5 style="float: left; margin-right:20px;">';
    foreach($matrix as $m){
        echo '<tr>';
        foreach($m as $n){
            echo '<td>'.$n.'</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
}

//empty array to store the matrix
$matrix = array();

//this is what keeps the current number to put into matrix
$cnt = 0;

//create the simple matrix
for($i=0;$i<=9;$i++){
    for($j=0;$j<=9;$j++){
        $matrix[$i][$j] = $cnt % 10;
        $cnt++;
    }
    $cnt++;
}

//display valid simple matrix
show($matrix);

//shuffle the rows in matrix to make it random
shuffle($matrix);

//display matrix with shuffled rows.
show($matrix);

//swap the columns in matrix to make it more random.
for($i=0;$i<=9;$i++){
    //pick a random column
    $r = mt_rand(0, 9);
    //now loop through each row and swap the columns $i with $r
    for($j=0;$j<=9;$j++){
        //store the old column value in another var
        $old = $matrix[$j][$i];
        //swap the column on this row with the random one
        $matrix[$j][$i] = $matrix[$j][$r];
        $matrix[$j][$r] = $old;
    }
}

//display final matrix with random rows and cols
show($matrix);
?>


1 commentaires

Fonctionne comme un charme! Merci. Je devrai le modifier un peu, utiliser dans mon code, mais c'est super! Merci Jonathan!



0
votes

hmm .. Je vois que vous avez déjà de bonnes réponses déjà, mais voici ma version:

4, 3, 0, 2, 6, 5, 7, 1, 8, 9
0, 2, 6, 5, 7, 1, 8, 9, 4, 3
7, 1, 8, 9, 4, 3, 0, 2, 6, 5
2, 6, 5, 7, 1, 8, 9, 4, 3, 0
6, 5, 7, 1, 8, 9, 4, 3, 0, 2
9, 4, 3, 0, 2, 6, 5, 7, 1, 8
8, 9, 4, 3, 0, 2, 6, 5, 7, 1
5, 7, 1, 8, 9, 4, 3, 0, 2, 6
1, 8, 9, 4, 3, 0, 2, 6, 5, 7
3, 0, 2, 6, 5, 7, 1, 8, 9, 4


5 commentaires

Mais ce n'est pas aléatoire du tout. Je connais la première rangée et le premier élément de la deuxième rangée, alors vous connaissez toute la deuxième ligne.


La question indique que «il n'y a jamais un numéro deux fois dans chaque rangée ou dans chaque colonne. Comment générer un tel tableau et chaque fois de manière aléatoire. ' C'est exactement ce que cela fait :)


Et toujours ce n'est pas vraiment "aléatoire".


Eh bien, cela pourrait être algorithmique et non fort cryptographiquement, mais aussi longtemps que la graine est aléatoire, vous obtiendrez des résultats aléatoires. Je ne comprends pas vraiment vos plaintes, cela satisfait complètement aux exigences. En outre, l'algorithme est assez rapide et des écailles linéairement aussi loin que possible.


D'accord, pas vraiment aléatoire. La première ligne est aléatoire. Mais chaque ligne après ceci est juste la même chose se déplaçait un peu. Si vous prenez l'échantillon, la première ligne vous avez les numéros: 4302657189. Si vous trouvez la ligne qui commence par le deuxième numéro, vous obtenez 3026571894. C'est le même ordre, sauf le premier numéro (4) est maintenant à la fin. Il est essentiellement décalé par 1. Si cela concerne des questions (comme sur un test), une fois que vous avez aligné une question, le reste est dans le même ordre après cela.



8
votes

D'accord, voici ma version:

0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3


7 commentaires

La solution que vous fournissez donne également une table que j'ai besoin. Merci aussi!


Si vous vouliez randomiser les lignes, vous pouvez simplement faire un shuffle ($ TRAY) à la fin. C'est essentiellement la même chose que la mienne, sauf que je fais des rangées puis des cols et que vous faites des cols puis des lignes. Cependant, cela sera plus rapide (comme vous l'avez dit) parce que votre solution ne échange pas alors que le mien le fait. Joli.


Oui, semble être le même algorithme avec une implémentation différente. J'ai essayé aussi de 1,0 seconde pour 500x500, c'est trois fois plus lent que le mien. D'autre part: le vôtre peut être compris tout de suite, tandis que le mien exige du papier ^^


Oui, testé à la fois la mine et le vôtre avec N = 500 à comparer et le vôtre était de 0,3 secondes et la mine a couru dans .7 Donc plus de 50%.


Qu'en est-il du cas lorsque j'ai 10 questions pour 17 joueurs et j'ai besoin d'au moins 1 fois toute question à donner pour 2 groupes ???? Je veux dire que la table NXN permet de dire que 10x10 est pour une affaire lorsque j'ai 10 questions et dans chaque tour, un groupe ou un joueur obtient une question, et la matrice offre la possibilité de veiller à ce que les 2 joueurs ne reçoivent la même question à l'heure. Et si nous avons 10> 17 cas? 10 questions pour 17 joueurs? Je veux dire quand le cas n'est pas nxn mais NXM où n


Dans ce cas, j'aurai besoin que la question se chevauche des temps minimums ... L'accord est que, lorsqu'une question est prise, la réponse est une place en ville et les joueurs devraient y aller et j'ai besoin de ce que l'endroit ne devrait pas être donné à trop de joueurs, de sorte qu'il ne sera pas surpeuplé ... Si vous vous aiderez aussi à ce que vous puissiez être mon idole :))))))


C'est un très bel algorithme, peut-être que vous pourriez créer un wiki communautaire expliquant comment et pourquoi cela fonctionne?