Šta je novo?

formula u C-u

sinke

Čuven
Učlanjen(a)
18.10.2000
Poruke
253
Poena
620
Treba mi kako da resim pitanje slucajnog broja od neke granice do 100. Evo recimo zamislim broj 76 on pita da li je recimo zamisljen broj 50, ja mu kazem da je veci znaci sledece sto treba da pogadja je slucajan broj u intervalu od 51 do 100, e to ne znam. U help-u ima primer za slucajan broj od 0 do 99 ali nema od nekog drugog broja do 100.

Slucajan broj radio sam po formuli randomize();
a=rand() %100
 
eto to je to...
samo odredi min i max , ja sam stavio 40 i 80
Ko sto vidish vrlo je jednostavno
[code:1]
#include <iostream.h>
#include <time.h>
#include <stdlib.h>

int main()
{
srand(time(NULL));
int razlika;

int min=40;
int max=80;

razlika = (max -min) +1;
int vrednost = (rand() % razlika)+ min ;
cout<<"Random broj izmedju "<<min<<" i "<<max<<" je "<<vrednost<<endl;
cin.get();
}
[/code:1]
 
Eksplicitnu formulu nemas vec se dovijas na neki nacin:
[code:1]
int broj , start=0 , opseg=100;
...
srand((unsigned) time (&t));
...
broj=start+(int)((double) rand() / RAND_MAX *opseg);
...
case veci : opseg=opseg + start - broj; start=broj; break;
case manji : opseg=broj - start; break;
...
[/code:1]
ili tako nesto i to bi bilo to.

Mozes sam da generises pseudoslucajni niz brojeva tako sto napravis svoj generator. Ovo ti je linearni kongruentni metod:
N(k)=a*N(k-1) + b mod c
a=314159269, b=907633409, c=2^32 a moze za c=0xFFFFFFFF;
Daje cele brojeve u opsegu od 0 do c-1.
X(k)=N(k)/c daje brojeve od [0,1). Pa uzmes da je za k=0, odnosno N(0)=1 i dobijes niz brojeva. Za N(0)=<nesto drugo, recimo kao kod srand kada preko tajmera uzimas neki broj u vremenu> dobijas neki malo drugaciji niz - sve su to pseudoslucajni generatori. Pravi generator slucajnih brojeva, samo hardverski :)
 
[/B][/QUOTE]

Hvala, muceci sam i ja sam dosao do ovog resenja, mislio sam da ima drugacije, ali neka, radi i ovako. Ali imam jos jedan problem, ajde ako ti nije tesko pogledaj gde je greska...:
[code:1]
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
void main ()
{
int s, a;
char i;
clrscr();
randomize();
s=rand() %101;
printf("Da li je zamisljen broj:%d ",s);
i=getchar();
if (i=='d')
printf("\nPOGODAK\n");
if (i=='n')
do
{
a=100-s;
s=s+1+rand() %a;
printf("\nDa li je:%d ",s);
i=getchar();
} while (i=='n');
printf ("Pogodili ste trazeni broj, a to je %d", s);
getch ();
}
[/code:1]
Uporno nece da u do while petlji dodje do onog i=getchar() da bi mogao da vidi da li je broj pogodjen nego preskoci to i izadje iz petlje. Veorvatno je nesto jednostavno ali eto danas ne vidim resneje. :)
 
Pa problem je u samoj funkciji getchar(). Prvo, ona vraca int a ne char kao sto si ti napisao. Drugo, ona vraca karakter koji se nalazi u ulaznom stream-u (to je u ovom slucaju stdin) i to je stvarno prvi put 'n'. Kada udje u do...while petlju, onda sledece getchar() vraca sledeci, a to je sada enter ili kraj reda, u svakom slucaju nije 'n' pa izlazi iz petlje.
Kada bi na prvo pitanje odgovorio sa 'nnnn' onda bi on procitao sa getchar() prvi put 'n', usao bi u do, pa bi i='n' i tako jos u dva puta, bez iakavog pitanja. Znaci, vraca niz u stream-u karaktera jedan za drugim, bez obzira sta ti upisao prvi put sve dok ne dodje do kraja stream-a.
Ako zelis da koristis getchar(), onda napisi ovako:
i=getchar();
fflush(stdin);

Ovo posle citanja, isprazni bafer, pa je on prazan i ceka se na unos i onda ce taj deo koda biti ispravan.

Umesto getchar(), bolje koristi getch() ili jos bolje getche().

Ali ti je moj savet da koristis c++-ov iostream. Stavi:
[code:1]
#include <iostream.h>
...
cout<<"Da li broj ok? "; cin>>i;
if (i=='n')....
...
[/code:1]
Znaci svuda gde je getchar, idi sa cin, a umesto sa printf, cout. Ovo kloristi stream-ove na pravi nacin i onako kako tebi treba, a uvodi i mogucnost preklapanja operatora.
 
Mozete koristiti [ code ] i [/ code ] tag-ove da biste ocuvali format source-a. Prepravio sam dosadasnje post-ove u ovom thread-u.
 
macak je napisao(la):
Kada udje u do...while petlju, onda sledece getchar() vraca sledeci, a to je sada enter ili kraj reda, u svakom slucaju nije 'n' pa izlazi iz petlje.
Kada bi na prvo pitanje odgovorio sa 'nnnn'

Hvala ti na ovome, moram da kazem da mi jeste puno pomoglo i izvini sto odgovor stize posle 2-3 dana imao sam dosta obaveza i poceo sam sa posla da ti odgovaram ali me prekinuli i onda nisam ni poslao.

Ako zelis da koristis getchar(), onda napisi ovako:
i=getchar();
fflush(stdin);


Umesto getchar(), bolje koristi getch() ili jos bolje getche().

Zasto ? I jos jedno pitanje nije mi malo jasan pojam stream-a, to nam profa nije objasnjavao.

Ali ti je moj savet da koristis c++-ov iostream. Stavi:
Kod:
Znaci svuda gde je getchar, idi sa cin, a umesto sa printf, cout. Ovo kloristi stream-ove na pravi nacin i onako kako tebi treba, a uvodi i mogucnost preklapanja operatora. [/quote]

Ne znam da li je moguce to u Turbo C-u, sigurno moze koristeci c++ kompajler ali profesor bas zeli ovako posto ispit polazemo i u C-u i u C++ tako da treba da se drzim scanf-a i getchar-a. E a probao sam isti program sa scanf ali mi isto nije radio, kasnije sam se tek odlucio za getchar, tako da mi nije bilo jasno zasto nije radio sa scanf.
 
E macak izvinjavam se, nisam dobro uredio moj prethodni post tako da je deo mog komentara i zahvalnica u okviru tvog texta, pa obrati paznju tamo koji je moj red i pitanje, hvala unapred.
 
...tako da mi nije bilo jasno zasto nije radio sa scanf.
Problem nastaje u ulaznom stream-u stdin.
Ako kazes:[code:1]
char i;
....
scnaf("%c",&i);
[/code:1]
onda kada pritisnes "n" pa ENTER, on onda ubaci u varijablu i ono "n", ali ENTER ostaje u stream-u. To resis ili onim fflush(stdin) iz scanf ili napises ovako:
[code:1]
scanf("%2c",&i)
[/code:1]
Ovakav scanf sada procita "n", stavi u i, a onda procita i ono ENTER iz stdin streama, ali ga nigde ne stavi jer nemamo target adresu u spisku adresa, tako da sledece scanf ocekuje unos sa tastature jer je sada stream prazan. Ista situacija kao i sa getchar (ona fora kao sto pise u prethodnom postu).
 
Vrh Dno