Rand – losowanie jednej z liczby

0

witam, w jaki sposób mogę uzyć randa zeby mi wylosować jedną z tych liczb:

liczby_lista = "5,123,66,34,879,43,567";
0

Wstawiasz liczby w tablicę i losujesz indeks, lol. Albo: http://php.net/manual/en/function.array-rand.php

0

Czyli:

    <?php
     
    $tablica = [5,123,66,34,879,43,567];
     
    echo $tablica[rand(0, count($tablica)-1)];
     
    ?>

albo prościej:

    <?php
     
    $tablica = [5,123,66,34,879,43,567];
     
    echo $tablica[array_rand($tablica)];
     
    ?>
0
kmph napisał(a):

Czyli:

    <?php
     
    $tablica = [5,123,66,34,879,43,567];
     
    echo $tablica[rand(0, count($tablica)-1)];
     
    ?>

albo prościej:

    <?php
     
    $tablica = [5,123,66,34,879,43,567];
     
    echo $tablica[array_rand($tablica)];
     
    ?>

wielkie dzięki :)

0
kmph napisał(a):

Czyli:

    <?php
     
    $tablica = [5,123,66,34,879,43,567];
     
    echo $tablica[rand(0, count($tablica)-1)];
     
    ?>

albo prościej:

    <?php
     
    $tablica = [5,123,66,34,879,43,567];
     
    echo $tablica[array_rand($tablica)];
     
    ?>

jeszcze jedno mam pytanko jak do tego dodać np zeby kazda liczba miała swoją szanse? np $tablica = [5;500,123;1000,66;700,34;400,879;5,43;45,567;657];

0

Losujesz liczbę całkowitą z zakresu [0; suma szans). Jeśli wylosujesz liczbę z zakresu [0; szansa na liczbę o indeksie 0) to bierzesz z tablicy liczbę o indeksie 0. Jeśli wylosujsz libczę z zakresu [szansza na licbzę o indeksie 0; szansza na liczbę o indeksie 0+szansza na liczbę o indeksie 1) to bierzesz liczbę o indeksie 1.

Zastanów się, nie będę pisał za ciebie całego kodu, a wpadnięcie na prawidłowe rozwiązanie naprawdę nie jest trudne.

0
kmph napisał(a):

Losujesz liczbę całkowitą z zakresu [0; suma szans). Jeśli wylosujesz liczbę z zakresu [0; szansa na liczbę o indeksie 0) to bierzesz z tablicy liczbę o indeksie 0. Jeśli wylosujsz libczę z zakresu [szansza na licbzę o indeksie 0; szansza na liczbę o indeksie 0+szansza na liczbę o indeksie 1) to bierzesz liczbę o indeksie 1.

Zastanów się, nie będę pisał za ciebie całego kodu, a wpadnięcie na prawidłowe rozwiązanie naprawdę nie jest trudne.

chciałem coś takiego zrobić ze np:
f = 10000 szans z (100000)
d = 6000 szans z (100000)
a = 5000 szans z (100000)
b = 4000 szans z (100000)
c = 3000 szans z (100000)
i zeby zaczynalo losowac od najmniejszej szansy do najwiekszej jezeli jakas litera zostanie wylosowana wtedy sie zatrzymuje

to co napisałeś wcale nie zrozumiałem przykro mi ale naprawdę nic z tego nie rozumiem

0

Przecież wiem, o co ci chodziło.

rand(1, 99) - losuje ci dowolną liczbę z zakresu od 1 do 100 włącznie.

Weź zeszyt w kratkę. Narysuj przedział na 10 kratek. 1 kratka = 10 szans. Razem masz więc 10 kratek po 10 szans, co daje 100 szans.

Teraz na tym przedziale o długości 10 kratek zaznacz podprzedział o długości 2 kratek, od kratki pierwszej do drugiej. Co daje razem 20 szans. Przyporządkuj do tego podprzedziału np. literkę a. Jeśli wylosowana liczba wpadnie do tego podprzedziału, to znaczy, że wylosowałeś literkę a.

Zaraz za tym podprzedziałem umieść kolejny podprzedział, tym razem o długości 3 kratek. Co daje razem 30 szans. Ustal, że jeśli wylosowana liczba wpadnie do tego podprzedziału, to znaczy, że wylosowałeś np. literkę b.

Zaraz za nim umieśćkolejny podprzedział, tym razem o długości 4 kratek. Co daje razem 40 szans. Ustal, że jeśli wylosowana liczba wpadnie do tego podprzedziału, to znaczy, że wylosowałeś literkę c.

Ostatnia kratka stanowi podprzedział o długości 1 kratki, czyli 10 szans. To jest popdrzedział przyporządkowany literce d.

Tak więc ostatecznie losujemy jedną spośród 4 literek: a, b, c, d, przy czym:

  • a - 20 szans na 100
  • b - 30 szans na 100
  • c - 40 szans na 100
  • d - 10 szans na 100

Zauważ, że oznacza to, że jeśli wylosowałeś liczbę z zakresu [1, 20], (np. liczbę 16), to oznacza to, że wylosowałeś literkę a (bo ta liczba należy do przedziału przyporządkowanego literce a, zaś jeśli wylosowałeś liczbę z zakresu [51, 90], (np. liczbę 51), to oznacza to, że wylosowałeś literkę c (bo liczba 51 należy do przedziału przyporządkowanego literce c.

Więcej naprawdę nic nie powiem, chyba że zaprezentujesz własną próbę rozwiązania tego zadania.

0
kmph napisał(a):

Przecież wiem, o co ci chodziło.

rand(1, 99) - losuje ci dowolną liczbę z zakresu od 1 do 100 włącznie.

Weź zeszyt w kratkę. Narysuj przedział na 10 kratek. 1 kratka = 10 szans. Razem masz więc 10 kratek po 10 szans, co daje 100 szans.

Teraz na tym przedziale o długości 10 kratek zaznacz podprzedział o długości 2 kratek, od kratki pierwszej do drugiej. Co daje razem 20 szans. Przyporządkuj do tego podprzedziału np. literkę a. Jeśli wylosowana liczba wpadnie do tego podprzedziału, to znaczy, że wylosowałeś literkę a.

Zaraz za tym podprzedziałem umieść kolejny podprzedział, tym razem o długości 3 kratek. Co daje razem 30 szans. Ustal, że jeśli wylosowana liczba wpadnie do tego podprzedziału, to znaczy, że wylosowałeś np. literkę b.

Zaraz za nim umieśćkolejny podprzedział, tym razem o długości 4 kratek. Co daje razem 40 szans. Ustal, że jeśli wylosowana liczba wpadnie do tego podprzedziału, to znaczy, że wylosowałeś literkę c.

Ostatnia kratka stanowi podprzedział o długości 1 kratki, czyli 10 szans. To jest popdrzedział przyporządkowany literce d.

Tak więc ostatecznie losujemy jedną spośród 4 literek: a, b, c, d, przy czym:

  • a - 20 szans na 100
  • b - 30 szans na 100
  • c - 40 szans na 100
  • d - 10 szans na 100

Zauważ, że oznacza to, że jeśli wylosowałeś liczbę z zakresu [1, 20], (np. liczbę 16), to oznacza to, że wylosowałeś literkę a (bo ta liczba należy do przedziału przyporządkowanego literce a, zaś jeśli wylosowałeś liczbę z zakresu [51, 90], (np. liczbę 51), to oznacza to, że wylosowałeś literkę c (bo liczba 51 należy do przedziału przyporządkowanego literce c.

Więcej naprawdę nic nie powiem, chyba że zaprezentujesz własną próbę rozwiązania tego zadania.

niby mozna przypozadkować liczbę pod randa
ale jezeli sa np
np
losowanie = rand(1,100)
if(losowanie == 100){
rand(c, d);
echo c = 100
echo d = 100
}

inaczej nie wiem jak to zrobic za pomocą tablicy

to wtedy wylosuję obydwie
no chyba ze jezeli wylosuje z tą samą szansą c,d to jeszcze raz losować miedzy nimi o to chodzi?

0

Po co Ci dwa randy?? Tak jak napisałem, wystarczy 1 losowanie. JEDNO. Jedno wywołanie funkcji rand. Tyle wystarczy. Jeśli wywołujesz funkcję rand dwa lub więcej razy, a niektóre do tego jeszcze zagnieżdżasz w ifach, to robisz to źle.

Przeczytaj jeszcze raz, co pisałem.

0
kmph napisał(a):

Po co Ci dwa randy?? Tak jak napisałem, wystarczy 1 losowanie. JEDNO. Jedno wywołanie funkcji rand. Tyle wystarczy. Jeśli wywołujesz funkcję rand dwa lub więcej razy, a niektóre do tego jeszcze zagnieżdżasz w ifach, to robisz to źle.

Przeczytaj jeszcze raz, co pisałem.

No ok ale dajmy na to przyklad ze chce jedna literke zamiast dwoch a obydwie beda miec to 100% wtedy rand mi wylosuje obydwie, moze dalej cos zle rozumiem musze pomyslec.

Ale bez ifa raczej to jest nie wykonywalne i ponownego losowania

0

a obydwie beda miec to 100%

Obydwie nie mogą mieć 100%, bo jeśli przy losowaniu jednej literki z iluśtam przypisujesz każdej literce wagi, to wszystkie te wagi muszą sumować się do 100%. A jeśli obydwie literki mają wagi po 100% to wówczas suma wag wynosi 200%, co jest absurdem.

Waga 100% oznacza pewność wylosowania. Więc jeśli losujesz 1 literkę z dwóch to nie możesz ustalić, że każda zostanie wylosowana na pewno!!

Zamiast tego możesz np. przypisać każdej z dwóch literek wagę 50%. Wówczas będziesz miał połowę szans, że wylosuje ci się jedna literka, i połowę szans, że wylosuje ci się druga. Albo możesz jednej literce dać wagę 20%, a drugiej 80%. Wtedy druga będzie wypadać 4 razy częściej, niż pierwsza.

Byleby wagi sumowały się do 100%.

EDIT: I dlatego też to jest źle:

chciałem coś takiego zrobić ze np:
f = 10000 szans z (100000)
d = 6000 szans z (100000)
a = 5000 szans z (100000)
b = 4000 szans z (100000)
c = 3000 szans z (100000)

Jeśli dajesz każdej literce ileś szans z 100000 to szanse muszą sumować się do 100000. Tymczasem tutaj szanse sumują ci się do 10000+6000+5000+4000+3000=28000. To oznacza, że pozostaje ci 100000-28000=72000 szans na to, że nie wylosuje ci się żadna literka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1