Επιλογή τυχαίων κλειδιών ενός πίνακα (και καλά!)

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Επιλογή τυχαίων κλειδιών ενός πίνακα (και καλά!)

Δημοσίευση από Christianago » 03 Ιούλ 2012 16:28

Εχω το παρακατω (περιεργης) λογικης προγραμμα. Γινεται επιλογη τυχαιων χαρακτηρων από εναν πινακα. Για καθε τιμη που επιλεγει
η array_rand αυτη η τιμη (και το κλειδι) διαγραφεται απο τον πινακα ετσι ωστε να μην την ξαναεπιλεξει και την αποθηκευω σε ενα νεο πινακα.
Ο πινακας αυτος οταν φθασει σε μεγεθος ισο με 5 αρχικοποιειται όπως και ο αρχικος πινακας με τους χαρακτηρες για να ξεκινησει νεα λουπα με αλλες τυχαιες τιμες.
Τουλαχιστον αυτο προσπαθω να κανω.

Επισης για να περιορισω τον αριθμο των εκτελεσεων, ελεγχω εαν η τιμη που επιλεγει η array_rand ειναι στην πρωτη δεκαδα,
ή σε περιπτωση που δεν είναι (δηλ. εχουμε τυχαια τιμη πανω από 9) ελεγχει εαν η απο πανω της τιμη εχει διαγραφει.
Εαν ισχυει ενα απο τα δυο τοτε βαζει την τυχαια τιμη στο νεο πινακα. Αν εκτελεσετε το προγραμμα επιλεγει οντως τυχαια συνολα,
αλλα δε γινεται σωστα ο ελεγχος:

Κώδικας: Επιλογή όλων

if &#40;isset&#40;$string&#91;$k&#93;&#41; && &#40;$k - 10 < 0 || empty&#40;$string&#91;$k - 10&#93;&#41;&#41;&#41;
Δηλαδη πολλες φορες εχω strings που το πρωτο γραμμα ξεκινα απο τη 2η δεκαδα,
ενω παντα πρεπει να ξεκινα απο την πρωτη και στη συνέχεια ή να επιλεγει γραμμα με κλειδι + 10
(δηλ. εαν η array_rand δωσει 15, τοτε στον πινακα θα αποθηκευτει η τιμη του κλειδιου 15 εάν το κλειδι 5 δεν υπαρχει-αλλιως δεν πρεπει να αποθηκευει τιποτα)
ή να παιρνει γραμμα παλι απο την 1η δεκαδα.

Κώδικας: Επιλογή όλων

for &#40;$j = 0; $j < 100; $j++&#41;&#123;
    
$string = array&#40;
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y"
&#41;;


$lotto = array&#40;&#41;; 

$i = 0;
foreach&#40;$string as & $value&#41;&#123;

$k = array_rand&#40;$string&#41;;

if &#40;isset&#40;$string&#91;$k&#93;&#41; && &#40;$k - 10 < 0 || empty&#40;$string&#91;$k - 10&#93;&#41;&#41;&#41;&#123;
$lotto&#91;$i&#93; = $string&#91;$k&#93;;
unset&#40;$string&#91;$k&#93;&#41;;
&#125;

if &#40;count&#40;$lotto&#41; > 4&#41;&#123;  
$joker = implode&#40;"", $lotto&#41;; 
echo "$joker\n";
$lotto = array&#40;&#41;; 
&#125; 

$i++;
    &#125;
&#125;

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Επιλογή τυχαίων κλειδιών ενός πίνακα (και καλά!)

Δημοσίευση από Christianago » 04 Ιούλ 2012 12:36

Τελικα το εφτιαξα το προβλημα. Το πραγματικο προβλημα ομως ειναι η array_rand η οποια δεν ειναι τοσο τυχαια η επιλογη που κανει παρα το γεγονος οτι ολα τα κλειδια ενος πινακα εχουν την ιδια πιθανοτητα να επιλεγουν. Παρατηρησα σε καθε επαναληψη της εξωτερικης λουπας επαναλαμβανονταν τα ιδια σετ κλειδιων παρολο που στην εσωτερικη λουπα ολα τα κλειδια ηταν διαφορετικα μεταξυ τους. Το προβλημα λυνεται με τη συναρτηση array_mt_rand:

Κώδικας: Επιλογή όλων

function array_mt_rand&#40;array $array, $numberOfKeys = 1&#41;
    &#123;
        if &#40;!is_int&#40;$numberOfKeys&#41;&#41; throw new Exception;
        if &#40;$numberOfKeys < 1&#41; throw new Exception;
        $keys = array_keys&#40;$array&#41;;
        $maximum = count&#40;$array&#41; - 1;
        if &#40;$numberOfKeys == 1&#41; &#123;
            return $keys&#91;mt_rand&#40;0, $maximum&#41;&#93;;
        &#125; else &#123;
            $randomKeys = array&#40;&#41;;
            for &#40;$i = 0; $i < $numberOfKeys; $i++&#41; &#123;
                $randomKeys&#91;&#93; = $keys&#91;mt_rand&#40;0, $maximum&#41;&#93;;
            &#125;
            return $randomKeys;
        &#125;
    &#125;

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες