• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Unity - skrypt na losową kolejność. Dlaczego działa?

Object Storage Arubacloud
0 głosów
729 wizyt
pytanie zadane 19 czerwca 2019 w C# przez niezalogowany
zamknięte 20 czerwca 2019

Witam,

zrobiłem funkcje wywoływaną na starcie, która przypisuje do ośmiu zmiennych losową liczbę od 1 do 8, ale ta liczba nie może się powtórzyć. W miejscu gdzie teraz są dziewiątki na początku było 8. Po odpaleniu gry w Unity się zawieszało. Myślałem że to przez to że ta ostatnia liczba nie chce się wylosować jako odpowiednia czy coś. Zmieniłem 8 na 9 aby sprawdzić czy to w czymś pomoże. I teraz działa tak jakby tam cały czas było 8. Wszystko działa tak jak miało na początku i dziewiątka nie wylosowuje się ani razu, mimo tego że powinna być tak samo często jak wszystkie inne liczby.  Ktoś jest w stanie mi wytłumaczyć dlaczego tak się dzieje?

    void Kolejnosc()
    {

        Losowanko = Random.Range(1, 9);
        JanuchaOrder = Losowanko;

        Losowanko = Random.Range(1, 9);

        for (int i = 0; i == 0;)
        {
            if (JanuchaOrder != Losowanko)
            {
                KlawiszOrder = Losowanko;
                i = 1;
                Losowanko = Random.Range(1, 9);
            }
            else
            {
                Losowanko = Random.Range(1, 9);
            }
        }

        for (int i = 0; i == 0;)
        {
            if (JanuchaOrder != Losowanko && KlawiszOrder != Losowanko)
            {
                KakOrder = Losowanko;
                i = 1;
                Losowanko = Random.Range(1, 9);
            }
            else
            {
                Losowanko = Random.Range(1, 9);
            }
        }

        for (int i = 0; i == 0;)
        {
            if (JanuchaOrder != Losowanko && KlawiszOrder != Losowanko && KakOrder != Losowanko)
            {
                KiedroOrder = Losowanko;
                i = 1;
                Losowanko = Random.Range(1, 9);
            }
            else
            {
                Losowanko = Random.Range(1, 9);
            }
        }

        for (int i = 0; i == 0;)
        {
            if (JanuchaOrder != Losowanko && KlawiszOrder != Losowanko && KakOrder != Losowanko && KiedroOrder != Losowanko)
            {
                Opponent1Order = Losowanko;
                i = 1;
                Losowanko = Random.Range(1, 9);
            }
            else
            {
                Losowanko = Random.Range(1, 9);
            }
        }

        for (int i = 0; i == 0;)
        {
            if (JanuchaOrder != Losowanko && KlawiszOrder != Losowanko && KakOrder != Losowanko && KiedroOrder != Losowanko && Opponent1Order != Losowanko)
            {
                Opponent2Order = Losowanko;
                i = 1;
                Losowanko = Random.Range(1, 9);
            }
            else
            {
                Losowanko = Random.Range(1, 9);
            }
        }

        for (int i = 0; i == 0;)
        {
            if (JanuchaOrder != Losowanko && KlawiszOrder != Losowanko && KakOrder != Losowanko && KiedroOrder != Losowanko && Opponent1Order != Losowanko && Opponent2Order != Losowanko)
            {
                Opponent3Order = Losowanko;
                i = 1;
                Losowanko = Random.Range(1, 9);
            }
            else
            {
                Losowanko = Random.Range(1, 9);
            }
        }

        for (int i = 0; i == 0;)
        {
            if (JanuchaOrder != Losowanko && KlawiszOrder != Losowanko && KakOrder != Losowanko && KiedroOrder != Losowanko && Opponent1Order != Losowanko && Opponent2Order != Losowanko && Opponent3Order != Losowanko)
            {
                Opponent4Order = Losowanko;
                i = 1;
                Losowanko = Random.Range(1, 9);
            }
            else
            {
                Losowanko = Random.Range(1, 9);
            }
        }
    }

 

komentarz zamknięcia: uzyskałem odpowiedź

2 odpowiedzi

0 głosów
odpowiedź 19 czerwca 2019 przez adrian17 Ekspert (344,860 p.)
wybrane 19 czerwca 2019
 
Najlepsza

Wszystko działa tak jak miało na początku i dziewiątka nie wylosowuje się ani razu, mimo tego że powinna być tak samo często jak wszystkie inne liczby.

Z dokumentacji:

Return a random integer number between min [inclusive] and max [exclusive]

Boczne uwagi:

for (int i = 0; i == 0;)

Co to wszystko jest...?

I jeśli chcesz mieć 8 losowych liczb bez powtórzeń z zakresu 1..8, to... nie prościej będzie zrobić zbiór [1, 2, 3, 4, 5, 6, 7, 8] i go przemieszać?

komentarz 19 czerwca 2019 przez niezalogowany
Dobra, teraz wszytko jasne.

Co do tego zbioru to nie wiem w jaki sposób mam go przemieszać. Jestem początkującym programistą.
komentarz 19 czerwca 2019 przez adrian17 Ekspert (344,860 p.)

Co do tego zbioru to nie wiem w jaki sposób mam go przemieszać. Jestem początkującym programistą.

Jasne. Niestety, nie jest to wbudowane :/ Osobiście bym na przykład użył: https://stackoverflow.com/questions/273313/randomize-a-listt

0 głosów
odpowiedź 19 czerwca 2019 przez Neespa Początkujący (300 p.)

dziewiątka nie wylosowuje się ani razu, mimo tego że powinna być tak samo często jak wszystkie inne liczby

 No własnie nie powinno jej być w ogóle :P 

Random.Range losuje liczbę od x do y-1 to znaczy w twoim przypadku Random.Range losuje od 1 do 9-1

czyli górna granica losowania musi być o 1 większa, dlatego 9 nigdy się nie wylosuje.

Jeżeli np. losował być liczby typu float (Random.Range(1.0,9.0) to 9.0 mogło by się pojawić, natomiast dla liczb typu int największa wartość się nie losuje.

Podobne pytania

+1 głos
1 odpowiedź 306 wizyt
pytanie zadane 28 lutego 2020 w C# przez kubekszklany Gaduła (3,190 p.)
0 głosów
1 odpowiedź 227 wizyt
0 głosów
1 odpowiedź 364 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...