[C++] pseudolosowanie

0

elo. korzystam z funkcji do wywolywania liczb pseudolosowych - random() i randomize(). jak moge wykluczyc jakas liczbe z losowania np funkcja ma losowac
liczby od 0 do 10 i jak moge wykluczyc liczbe 4 i 7 z tego losowania??

0

Chyba <ort>po prostu </ort>musisz pętle zrobić i podać warunek że ma być różne od tych liczb a jak nie jest różne to pętla jeszcze raz losuje i już :)

0

a wiesz jak w builderze po zajsciu jakiegos zdarzenia np nacisniecie buttona zmienial sie obrazek w TImage? taki z pliku?

0

Daaaaaawno już nic nie robiłem w BCB ale chyba to było tak:
Image1->Picture->LoadFromFile("NAZWA");

0

Pętla może zająć wieczność przy liczbach losowych (przy pseudolosowych zależy), więc lepiej jest napisać:

int a=random(1,8);/random(a,b) zwraca liczbę pseudolosową od a do b/
if(a>3|a<7)
{
a++;
}
else(a>7)
a+=2;

0

Możesz też wrzucić wszystkie liczby które możesz wylosować to tablicy, najlepiej na początku programu, a później losujesz tylko pozycję w tej tablicy - nie znajdą się tam liczby których nie będziesz chciał otrzymać ;P

0

Fakt dobry sposób żeś wymyślił :-| ale nie powiedział bym by pętla zajęła wieczność ;-) Nawet jak raz napisałem program losujący liczby od 1- 1000 to co kilka sekund losował liczbę 51 (bo tylko wtedy działa sie pewna akcja) tak więc losowanie jest ekspresowe i prawdopodobnie nie trwało by dłużej niż setna część sekundy :)

0

while(random(0,1))
continue;

zużywa x czasu na wykonanie. Prawdopodobieństwo, że wykona się n razy wynosi
2^(-n),
więc może zająć wieczność.

0

??? No i <ort>uwarzasz </ort>że jak wzór napiszesz to to już oznacza że tak będzie? Moim zdaniem to dobrze wiesz że jest tak tylko w teorii.

0

Mam następujący problem. Z tego co wyczytałem rand() losuje liczby z zakresu od 0, ale jak wylosować w takim razie liczby, które również będą mniejsze od zera (w przedziale wartości jakie przyjmuje np. integer)? I taki dodatek: te same wartości z wyłączeniem zera?

0

Po pierwsze trochę pomyśl, po drugie przeczytaj cały wątek.

int a=random(a,b)-c;

losuje liczby z zakresu [a-c,b-c)
@revo napisał

Możesz też wrzucić wszystkie liczby które możesz wylosować to tablicy, najlepiej na początku programu, a później losujesz tylko pozycję w tej tablicy - nie znajdą się tam liczby których nie będziesz chciał otrzymać

int liczby[20];
for(int i=0;i<10;i++)
{
    liczby[i]=i+1;
    iczby[i+10]=-(i+1);
}

i w tablicy liczby masz 1,2,..,10 oraz -10,-9,..,-1
// poprawiłem literówkę

0

a nie z przedzialu [a-c, b-c) ?

0
T72 napisał(a)

??? No i uwarzasz że jak wzór napiszesz to to już oznacza że tak będzie? Moim zdaniem to dobrze wiesz że jest tak tylko w teorii.

A teoria wzglednosci to co? Bedziesz uparcie twierdzil, ze to tylko teoria, wiec mozna ja pominac? Jesli szczytem twoich ambicji jest pisanie programow, ktore beda dzialac tylko podczas trzeciej pelni co szostego przestepnego roku, to jest mi Ciebie zal.

0

Po pierwsze trochę pomyśl, po drugie przeczytaj cały wątek.
int a=random(a,b)-c;

losuje liczby z zakresu [a-c,b-c)

Ojojoj, cosik się wam pomieszało. random bierze jeden argument. Zresztą nawet jakby brał 2 (od, do), to nie potrzebne te odejmowania.

W każdym razie jako parametr random podajemy ilość możliwych przypadków do wylosowania.

  1. Jeśli chcemy losować kolejne liczby z zakresu [0, x)
random(x)
  1. Jeśli chcemy losować kolejne liczby z zakresu [a, b) mamy (b-a) wszystkich możliwych liczb. Random losuje liczby od 0, my chcemy liczby od a, więc dodajemy a do wyniku losowania:
random(b-a) + a
  1. jeśli chcesz losować liczby z zakresu [a, b) z pominięciem tylko kliku z nich np. liczby c, d, e takie, że c<d<e to mamy do wylosowania b-a-3 liczb zaczynających się od a
liczba = random(b-a)+a;

teraz w liczba mamy liczbę losową z zakresu [a, b-3). 3 niedozwolone wyniki (c, d, e) zamieniamy na kolejne trzy liczby z przedziału [b-3, b)if(liczba == c) liczba = b-3;
else if(liczba == d) liczba = b-2;
else if(liczba == e) liczba = b-1;

W ten sposób wyniki niedozwolone zapełnią nielosowany koniec przedziału [b-3, b). Możemy też inaczej - "rozciągnąć" wyniki losowania po całym przedziale [a, b) przez przesuwanie wyników w górę tyle oczek, ile niedozwolonych wartości przekroczyliśmy
```cpp
if(liczba > c) liczba++;
if(liczba > d) liczba++;
if(liczba > e) liczba++;
jeśli chcesz losować liczby z 2 zakresów [a, b) + [c, d) mamy do wylosowania (a-b+c-d) liczb zaczynając od a</li> </ol>
liczba = random(a-b+c-d) + a;

przesuwamy wyniki z zakresu [b, c) na koniecif((liczba >= b) && (liczba < c)) liczba += c-b;

lub "rozciągamy" wyniki po całym przedziale<code class="cpp">if(liczba >= b) liczba += c-b;
Its not me napisał(a)
T72 napisał(a)

??? No i uwarzasz że jak wzór napiszesz to to już oznacza że tak będzie? Moim zdaniem to dobrze wiesz że jest tak tylko w teorii.

A teoria wzglednosci to co? Bedziesz uparcie twierdzil, ze to tylko teoria, wiec mozna ja pominac? Jesli szczytem twoich ambicji jest pisanie programow, ktore beda dzialac tylko podczas trzeciej pelni co szostego przestepnego roku, to jest mi Ciebie zal.
Jakby to fajnie było, jakbyście oboje rozumieli pojęcie "teoria".
Poza tym, (jak zresztą sam TKW zauważyłeś) w generatorze pseudolosowym nie ma możliwości zajście czegoś takiego. Ba. Nie ma nawet możliwości aby ta sama liczba była wylosowana kilka razy pod rząd (a gdzie tu jeszcze do nieskończoności :D ).
Mimo wszystko i tak nie jestem zwolennikiem wielokrotnego losowania, aż do skutku. Wszystko można łatwo policzyć.

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