Losowanie inta z przedziału

0

Witam wszystkich forumowiczów,
Potrzebuję napisać jak naprościej funkcję, która będzie losowała mi inta a zadanego przedziału od granicy_dolnej do granicy górnej.
W C++ nie mam z tym problemów:

 
losowanie = zakres_dolny + (rand() % (zakres_gorny - zakres_dolny+1)); 

Do tego dodaje sobie linijkę kodu dzięki której za każdym razem losuje mi inne inty:

 
srand((unsigned int)time(NULL)); 

Jednak tutaj klasa Random udostępnia wiele metod, których nie potrafię w ten sposób uzyć (nextInt()). Chodzi mi o najprostszą metodę losowania inta z przedziału. Proszę o pomoc:)

0

new Random() = new Random(System.currentTimeMillis()) - czyli to samo co z srand(time(0)), nie najlepsze, ale w wielu przypadkach OK

nextInt() == rand(). Dodatkowo w Javie masz nextInt(int) i nie musisz dzielić modulo.

0

Metoda klasy Random:
nextInt(int)
zwraca mi kolejnego inta od podanego w parametrze losowego? Bo już spotkałem się z wieloma teoriami i definicjami.
I ja chcę żeby ten Int nie przekraczał pewnej górnej granicy.

gdy robię to tak:

   zakres_gorny=3;
   while(nie wylosuje zadanej liczby intow)
   {
           Random r = new Random();
           losowanie =  r.nextInt(zakres_gorny) ;
           zakres_gorny=losowanie +  5;
   }
 

Mój wygenerowany kod: 1, 5, 7, 8, 7, 3, 0, 0, 3, 7, 8, 11, 2, 0, 3,
A potrzebuje takiego: 1, 5, 7, 8, 11, 13 ,15, 16... i tak coraz więcej coraz więcej. Liczby nie mogą się powtarzać i muszą być uporządkowane rosnąco.

0

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextInt%28int%29

No to losuj z przedziału (0, X), potem (a, X) (gdzie a to wylosowana liczba), potem (b, X) (gdzie b to kolejna wylosowana liczba), etc. Ale nie masz gwarancji, że np w drugiej iteracji nie wylosujesz juz X (czyli gornej granicy) - co wtedy ? :>

0

Nie losuj liczb z ciągu, ale przyrost (wylosowane liczby są pamiętane w tablicy):

Random r=new Random();
int[] liczby = int[...];
liczby[0]=r.nextInt(...);
int i=1;
while(...)
{
     liczby[i]=liczby[i-1]+1+r.nextInt(...);
     i++;
}

0

Witam wszystkich,
Do losowa_nazwa: "...No to losuj z przedziału (0, X), potem (a, X) (gdzie a to wylosowana liczba), potem (b, X)..."
Właśnie to zamierzam osiągnąć, ale nie mogę uzyskać odpowiedniego efektu losowania z tych przedziałów.

Jak mam wylosować liczbę np. z przedziału (4, 9)? W żaden sposób mi nie wychodzi.

0

Wtf? Przecież Ci napisałem rozwiązanie.
Liczbę z przedziału (a,b) losujesz tak:

   ...=r.nextInt(b-a)+a;
0

Poprawka:

   ...=r.nextInt(b-a-1)+a+1;
0

int liczba_losowa = Random.nextInt(gora-dol-1)+dol+1;

przy zakresie
gora=4;
dol=0;

Po wygenerowaniu setek liczb z tego przedziału stwierdzam, że nigdy na pierwszym miejscu nie było 0 ani 1... zawsze 2,3,4 oczywiście granica górna jest zachowana.

0

nextInt(a) zwraca liczbe losowa z przedzialu <0, a). Czyli jesli chcesz wylosowac liczby z przedzialu <0, 4) to musisz dac: nextInt(4), jesli chcesz <4, 9) to musisz dac nextInt(5)+4; // bo min bedzie: 0+4 = 4, a max = 4+4 = 8

0

Zera nie wyjdzie, bo zera nie chciałeś. Napisałeś liczby z przedziału (a,b), dla dol=0, gora=4, wię losowane są liczby z przedziału (0,4) 1,2 lub 3.
Co do braku jedynki, to pie**dolisz.

import java.util.*;
public class Losowacz
{
    public static void main(String[] args)
    {
        Random r=new Random();
        int[] wyniki=new int[3];
        for(int i=0;i<=100000;i++)
        {
            int l=r.nextInt(3)+1;
            wyniki[l-1]++;
        }
        for(int i=0;i<wyniki.length;i++)
        {
            System.out.println(wyniki[i]);
        }
    }
}

Wynik:
33469
33144
33388

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