Strona 1 z 2

funkcja rand oraz tablica

Napisane: sobota, 17 marca 2012, 01:23
przez tajger
Chce stworzyć pętle ktora bedzie mi losowac NUMER PESELA. Wiadomo, że pesel jest 11-cyfrowy. Problem jest taki, że podczas losowania do 9 cyfer wszysztko jest ok tzn. losowanie jest prawidłowe, a gdy dodaję kolejne 0 lub 9, żeby podwyższyć losowanie liczb np. przy losowaniu już liczb 10 lub 11 cyfowych to na peirwszym miejscu losowania zawsze stoje jedynka, potem jest albo 0,1,2,3 lub 4.. a reszte liczb losuje jakos .. czy funkcja rand ma jakiś zakres losowania liczb?

tutaj mamy liczbe 9 cyfrową (prawidłowo losuje)

Code: Zaznacz cały

echo var_dump(rand(100000000,999999999));
tutaj mamy liczbe 10 cyfrową (nieprawidłowo losuje)

Code: Zaznacz cały

echo var_dump(rand(1000000000,9999999999));

drugie pytanie:
Czy jest to normalne zagnieżdżanie tablic w tablicach tym sposobem, który sobie wymyśliłem.. w tym momencie nowa tablica nie ma nazwy, ale jak się do niej odwołać?

Code: Zaznacz cały

$tab = array();
$tab[1] = array (23,45,67,1,2,56,78);

echo "<pre>";
print_r($tab);
echo "</pre>";
lepszy jest ten sposób:

Code: Zaznacz cały

$tab[1] = ($tab2 = array (23,45,67,1,2,56,78));
.. ale jestem strasznie ciekaw jak się odwołać/wypisać dany element z tego: $tab[1] = array (23,45,67,1,2,56,78); ??

Re: funkcja rand oraz tablica

Napisane: sobota, 17 marca 2012, 10:01
przez Morfidon
Liczby mają zakres, nie możesz stworzyć liczby nieskończenie wielkiej. Jeśli chcesz mieć dłuższą liczbę to w takim wypadku losuj zakres od 1 do 9 kilkakrotnie i połącz te liczby w całość.

Powinno się pisać tak:

Code: Zaznacz cały

$tab = array();
$tab[] = array (23,45,67,1,2,56,78);

echo "<pre>";
print_r($tab);
echo "</pre>";
$tab[0][0] - to 23. Stworzyłeś tak tablicę dwuwymiarową.

Ten pierwszy sposób jest lepszy, jest czytelny i wiadomo o co chodzi.

Re: funkcja rand oraz tablica

Napisane: sobota, 17 marca 2012, 13:08
przez tajger
... a ja myślałem że w tab[1] tworzę tablicę jednowymiarową o iluś tam elementach, a tak naprawdę to są tablice dwuwymiarowe na to wygląda

z randem to chyba sobie podziele że najpierw 5 liczb a potem 6 liczb np.

Code: Zaznacz cały

echo rand(10000,99999).rand(100000,999999);
chyba zadziała idę testować

Re: funkcja rand oraz tablica

Napisane: sobota, 17 marca 2012, 15:51
przez tajger
Jak zrobić, żeby elementy losowe nie powtarzały się? Myślałem o jakims ifie, ale jak to porównać? Chce aby po prostu elementy z tablicy wyświetliły się w innej kolejności - niepowtórzone. Moim zdaniem jest to przydatne naprawdę. Będziemy mieli kiedyś tablice i z niej wypisujem randomowo elementy aby się nie powtórzyły.

Code: Zaznacz cały

$tablica = array (1 => "Łukasz", "Iza", "Marek", "Grzesiek", "Damian");

$e=1;
while ($e++ <= count($tablica))
{
    echo $tablica[rand(1, count($tablica))]."<br />";
    
}

Re: funkcja rand oraz tablica

Napisane: niedziela, 18 marca 2012, 00:58
przez tajger
prawie to jest ukończone tylko nie potrafię co zrobić tego jeśli się powtórzy to co napisać w ELSIE .. to powinny byc jakies 2 albo 1 pętla która to by zrobiła moim zdaniem...

Code: Zaznacz cały

$tablica = array (1 => "Łukasz", "Iza", "Marek", "Grzesiek", "Damian");

$e=1;

while ($e <= count($tablica))
{
    if ($e==1)
    {
    $x1 = $tablica[rand(1, count($tablica))];
    echo $x1."<br />";
    }
    
    if ($e==2)
    {
    $x2 = $tablica[rand(1, count($tablica))];
        if ($x2 != $x1)
    echo $x2."<br />";
        else
    echo "powtórzyło się [$x2]<br />";    
    }
    
    if ($e==3)
    {
    $x3 = $tablica[rand(1, count($tablica))];
        if (($x3 != $x1) && ($x3 != $x2))
    echo $x3."<br />";
        else
    echo "powtórzyło się [$x3]<br />";    
    }
    
    if ($e==4)
    {
    $x4 = $tablica[rand(1, count($tablica))];
        if (($x4 != $x1) && ($x4 != $x2) && ($x4 != $x3))
    echo $x4."<br />";
        else
    echo "powtórzyło się [$x4]<br />";   
    }
    
    if ($e==5)
    {
    $x5 = $tablica[rand(1, count($tablica))];
        if (($x5 != $x1) && ($x5 != $x2) && ($x5 != $x3) && ($x5 != $x4))
    echo $x5."<br />";
        else
    echo "powtórzyło się [$x5]<br />";   
    }
    
    
    
    $e++;
}




echo "<pre>";
print_r($tablica);
echo "</pre>";

Re: funkcja rand oraz tablica

Napisane: niedziela, 18 marca 2012, 21:18
przez Morfidon
Musisz zrobić pętlę zagnieżdżoną. Losujesz element, a następnie następna pętla w pierwszej pętli sprawdza wszystkie dotychczasowe elementy. Jeśli jeden z elementów się powtórzy to musisz powtórzyć wykonanie pętli. Kod ten nie powinien być dłuższy niż parę linijek...

Re: funkcja rand oraz tablica

Napisane: niedziela, 18 marca 2012, 22:01
przez tajger
też tak myślałem... ale tak patrzę kurde na ten kod to tego moim zdaniem jest za dużo.. wydaje mi sie ze caly program mozna zrobic w 1 lub w 2 petlach... a jakby np. zrobić żeby element wylosowany kasować z tablicy .. da siętak zrobić?

Re: funkcja rand oraz tablica

Napisane: poniedziałek, 19 marca 2012, 09:12
przez Morfidon
To co mówię jest najlepszym rozwiązaniem, w razie gdyby wylosowało powtórzony element, to przypisujesz do tego samego miejsca nową wartość, czyli teoretycznie starą usuwasz.

Re: funkcja rand oraz tablica

Napisane: poniedziałek, 19 marca 2012, 13:01
przez tajger
ok spróbuję to zrobić...

weź ogarnij to.. próbowałem tę funkcję ale jakoś dziwnie losuje i działa :D

http://www.php.net/manual/en/function.array-rand.php

Re: funkcja rand oraz tablica

Napisane: poniedziałek, 19 marca 2012, 17:00
przez tajger
zrobiłem IFAMI: (aż wstyd na to patrzeć, dal odróżnienia wyników tj. rezultatów końcówki w zależności dodałem)

Code: Zaznacz cały

<?php
$tablica = array (1 => "Łukasz", "Iza", "Marek", "Grzesiek", "Damian");

    $x1 = $tablica[rand(1, count($tablica))];
    echo $x1."_1<br />";
   
    $x2 = $tablica[rand(1, count($tablica))];
        if ($x2 != $x1)
    echo $x2."_2<br />";
        else
        {
           
           do
           {    
               $x2 = $tablica[rand(1, count($tablica))]; //losuj dopóki $x2 będzie różne od $x1
               if ($x2 != $x1)
                  echo $x2."_22<br />";
               
           }
           while ($x2 == $x1);
               
        }
 
        
    $x3 = $tablica[rand(1, count($tablica))];
        if (($x3 != $x1) && ($x3 != $x2))
    echo $x3."_3<br />";
        else
        {
            do
           {    
               $x3 = $tablica[rand(1, count($tablica))];
               if (($x3 != $x1) && ($x3 != $x2))
                  echo $x3."_33<br />";
               
           }
           while (($x3 == $x1) || ($x3 == $x2));
        }
             
        
    $x4 = $tablica[rand(1, count($tablica))];
        if (($x4 != $x1) && ($x4 != $x2) && ($x4 != $x3))
    echo $x4."_4<br />";
        else
        {
            do
           {    
               $x4 = $tablica[rand(1, count($tablica))];
               if (($x4 != $x1) && ($x4 != $x2) && ($x4 != $x3))
                  echo $x4."_44<br />";
               
           }
           while (($x4 == $x1) || ($x4 == $x2) || ($x4 == $x3));
        }
        
    $x5 = $tablica[rand(1, count($tablica))];
        if (($x5 != $x1) && ($x5 != $x2) && ($x5 != $x3) && ($x5 != $x4))
    echo $x5."_5<br />";
        else
        {
            do
           {    
               $x5 = $tablica[rand(1, count($tablica))];
               if (($x5 != $x1) && ($x5 != $x2) && ($x5 != $x3) && ($x5 != $x4))
                  echo $x5."_55<br />";
               
           }
           while (($x5 == $x1) || ($x5 == $x2) || ($x5 == $x3) || ($x5 == $x4));
        }
... teraz musze to przerobić na pętle bardziej BO się musi to dać .. :D