» »

c++ random funkcija

c++ random funkcija

Eliminator ::

A je kdo tu gor ki bi mi lahko razlozil random funkcijo. Priblizno znam napisat, da mi izpisuje random stevila, samo mi ni cisto jasno.

Prvo vprasanje je, kajpomeni ta znak pri funkciji %.
Tale funckija rand() % 10 + 1; izpisuje stevila od 1 do 10? Vendar ne razumem zakaj:D .

Drugo vprasanje pa je, kako se napise random funckija, ki ti izpisuje stevila od -10 pa do 10.
Probavo sem ze par stvari, vendar mi se do zdaj nic ni delalo.

Upam da se bo najdo keri tu ko bi mi lahko to malo razlozo.

Hvala za pomoc.

IceBoX ::

Funkcija rand ti vrže števila od 0 do 1, ker pa ti hočeš da ti vrže naključna števila do 10, na koncu dodaš 10, tako da zdaj bi ti vrglo naključna števila od 0 do 9, ker pa imaš na koncu +1, ti ne bo vrglo naključnih števil od 0 do 9, ampak od 1 do 10. Torej, če hočeš da ti recimo vrže števil od 1 do 30... rand() % 30 +1. Glede mej pa je tako da narediš da ti najprej izbere naključno številko in nato od te številke odšteješ neko določeno število.

Eliminator ::

A lahko prosim napises en primer za te meje. Meni je sedaj uspelo naredit program da vnesem koliko stevil naj izpise... Program zgleda tako:
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;

int main()
{
    int n;
    int random_stevila;
    srand(time(0));
    
    cout<<"Vnesi koliko stevil naj generira: "<<endl;
    cin>>n;
    cout<<endl;
    
    for(int i=0; i<n; i++)
    {
            random_stevila=(rand()%10)+1;
            cout<<random_stevila<<endl;
    }
cout<<endl;
    
system("pause");
return 0;
}



Kako pa bi sedaj naredo da mi random stevila od -10 pa do 10 recimo.

Hvala za pomoc

xordie ::

Funkcija rand() vraca int med 0 in RAND_MAX.

1. Operator % pomeni celostevilski ostanek pri deljenju.
Npr.: 19 % 10 = 9
20 % 10 = 0

Ker v tem primeru delis z 10 je najvecji mozen ostanek 9. Od tukaj sledi da je min vrednost v tem primeru 0 max pa 9.

2. Da dolocis stevilo s katerim bos delil rand() vrednost je najbolje, da minimalno vrednost posatvis na 0. Torej v tvojem primeru:

min: -10 + 10 = 0
max: 10 + 10 = 20

Ker imas zdaj najvecji mozen ostanek 20, pristejes 1 in dobis modul po katerem lahko delis radn().

rand() % 21

Da prides na svoj interval se odstejes stevilo, ki si ga uporabil pri premiku minimalne vrednosti.

radn() % 21 - 10
x

Eliminator ::

Torej zaj sem spremenil kodo in sem dobil takole:


#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;

int main()
{
    int n;
    int random_stevila;
    srand(time(0));
    
    cout<<"Vnesi koliko stevil naj generira: "<<endl;
    cin>>n;
    cout<<endl;
    
    for(int i=0; i<n; i++)
    {

            random_stevila=rand()%21-1;
            cout<<random_stevila<<endl;
    }
cout<<endl;
    
system("pause");
return 0;
}


Ampak sedaj ko vnesem recimo koliko stevil mi naj izpise, mi najmanjso stevilo katero sploh izpise, izpiše -1... Majn od -1 ne izpise.. Program sem zagnal tudi veckrat in vedno je najmansa vrednost -1. Ali sem naredil kako napako v kodi ali kaj ?

Eliminator ::

Aha sem odkril napako:D. Tam sem namesto random_stevila=rand()%21-10; napiso random_stevila=rand()%21-1;:D

Hvala za trud in pomoc :D

Ce pa se nebom kaj znal pa napisem tu :D

LP :D

Eliminator ::

Naletel sem zopet na eno tezavo. Da bi to nalogo lazje resil, bi lahko uporabo polja. Ker se nikoli nisem delal z polji bi prosil ce mi lahko malo pomagate.. Torej tole zgornjo kodo za izpis stevil, bi rad uporabil v funkciji branje, s tem, da bi stevila shranil v polje in potem izpisal. Nekaj sem sam probavo napisat, vendar mi ni nic uspelo. To je primer moje kode ki sedaj ne dela cisto vredu :D

void branje(int polje[],int velikost)
{
    
    int random_stevila;
    srand(time(0));
    
    
    cout<<"Vnesi koliko stevil naj generira: "<<endl;
    cin>>velikost;
    cout<<endl;
    
    for(int i=0; i<velikost; i++)
    {

            random_stevila=rand()%21-10;
            polje[i]=random_stevila;
            cout<<polje[i]<<endl;
    }
cout<<endl;
}

int main()
{
    
    
    int polje[velikost];
    
    branje(polje, velikost);
    
    
    
    
system("pause");
return 0;
}


Hvala za pomoc

Senitel ::

void branje()
{
    int random_stevila;
    srand(time(0));
    
    cout<<"Vnesi koliko stevil naj generira: "<<endl;
    cin>>velikost;
    cout<<endl;

    vector<int> polje;
    for(int i=0; i<velikost; i++)
    {
            random_stevila=rand()%21-10;
            polje.push_back(random_stevila);
            cout<<polje[i]<<endl;
    }
    cout<<endl;
}

int main()
{
    branje();
    
    system("pause");
    return 0;
}

Zgodovina sprememb…

  • spremenil: Senitel ()

Eliminator ::

Kaj pa pomeni
vector<int> polje;
. Ta vector ne vem kaj je pa zakaj je int v
<>
. Gledam tu po eni knjigi ki jo mamo v soli in nikjer nisem zasledil taksnega opisa. Vedno mamo v glavi funkcije zapisane argumente. Se da na kak nacin tako zapisat, kot sem jaz v kodi objavo? Sej mensezdi da bi mogla bit funkcija branje pravilno zapisana, samo potem klicat ne znam te funkcije v main programu.

Senitel ::

Ja če uporabljaš C++, potem uporabljaj vectorje, če uporabljaš C, potem pilotiraj okrog z dinamičnimi arrayi.

Generalno ti ona koda ne dela, ker rezerviraš polje določene velikosti, tista spremenljivka se pa potem spremeni znotraj une funkcije.

Če potrebuješ tabelo zunaj funkcije, potem jo pač vrni ven po referenci:
void branje(vector<int>& polje)

Eliminator ::

Ja jaz sem glede na primere iz knjige nekak tak studiral tole nalogo. Da bi v glavi funkcije deklariro:
void branje(int polje[], int velikost)

Tu je pol pac koda...

pol pa bi klical funkcijo nekak tak:
branje(polje[],velikost);

Samo tu mi pol neke errore ven vrze, da ni velikost deklarirana pa polje ni deklarirano. Tu se da kaj okoli tega resit ?

Senitel ::

Potem moraš naredit tole takole:
void branje(int** polje)
{
    int random_stevila;
    srand(time(0));
    
    cout<<"Vnesi koliko stevil naj generira: "<<endl;
    cin>>velikost;
    cout<<endl;
    
    *polje = new int[velikost];
    for(int i=0; i<velikost; i++)
    {
            random_stevila=rand()%21-10;
            (*polje)[i]=random_stevila;
            cout<<polje[i]<<endl;
    }
    cout<<endl;
}

int main()
{
    int* polje = NULL;
    branje(&polje);

    system("pause");
    if (polje) delete [] polje;
    return 0;
}

Ampak resno... Vzemi vector...

metalc ::

Eliminator je izjavil:

Kaj pa pomeni
vector&lt;int&gt; polje;
. Ta vector ne vem kaj je pa zakaj je int v
&lt;&gt;
.


Če vidiš nekaj med znakoma za manjše in večje, gre za uporabo "templatov" (šablon, kalupov, ...). Sicer je to naprednejša tema (včasih je bil tudi članek na ST o tem) in z njo poveš, s katerim tipom naj šablonizirani razred pravzaprav dela. V tvojem primeru pač poveš, da boš v vektor tlačil cela števila (int), lahko bi komot tudi kaj drugega, npr. realna števila (float ali double), nize, kazalce, lahko tudi razrede.

Vector (morda bi bilo intuitivnejše ime array, ampak kaj čmo) je sicer ena izmed podatkovnih struktur iz knjižnice STL, ki je priložena vsakemu prevajalniku za C++, primerna je, kadar bi rad veliko dostopal do poljubnih elementov v polju. Zelo spominja na new[] in tudi koda ti lahko zgleda skoraj enako, ob tem pa ti sam skrbi za operacije s pomnilnikom ipd. Več o tem razredu in z nekaj primerčki pa tule

MasterMind ::

Eliminator, priporočam ti, da si pogledaš osnove C ali C++. Priporočal bi ti stran http://cplusplus.com.

Drugače pa, če hočš rešiti s kazalci, si poglej http://prene.si/o0dxK pod poglavjem kazalci. Mogoče ti bo ta kup besed kaj pomagal :) .
Gentoo, KDE uporabnik.

Zgodovina sprememb…

Eliminator ::

Super!

Hvala mi je uspelo. Sedaj pa se imam eno vprasanje glede random funkcije. Ali random funkcija izpisuje samo celostevilcne vrednoti(2,6,4,-2....) ali se da druga stevila tudi generirat. Rad mi da bi mi gneriralo recimo -9.43,2.43....

bigbada ::

malo pogooglaj...namesto integerjev das double recimo.. prej si imel int random_stevila

MasterMind ::

Poglej http://cplusplus.com/reference/clibrary.... Za decimalna mesta boš potreboval še kakšno operacijo, ki ti preslika celoštevilsko število v realno število :) .

PS: Prva taka operacija ki mi pade na glavo, bi bila deljenje s 100...
Gentoo, KDE uporabnik.

IceBoX ::

Kako bi pa naredili, če bi recimo imel "Ocene" in ocene od 1-5. Zanima pa me, kako narediti da se ti recimo ocena 3 izpiše 50%, 2 recimo 10%, 4 20% in 5 10%?

Eliminator ::

if (ocena==3)
cout<<"50%";

else if (ocena==2)
cout<<"10%";

else if (ocena==5)
cout<<"100%";


Lahko tako ;P

Zgodovina sprememb…

Eliminator ::

MasterMind je izjavil:

Poglej http://cplusplus.com/reference/clibrary.... Za decimalna mesta boš potreboval še kakšno operacijo, ki ti preslika celoštevilsko število v realno število :) .

PS: Prva taka operacija ki mi pade na glavo, bi bila deljenje s 100...


Ja, ampak ce uporabim to z deljenjem z 100. Potem nikoli nebo generiralo celih stevil.. recimo 2... ampak bo namesto tega 0.02. Jaz pa bi rad da bi recimo generiralo tako:

-10,-7.88,0,4,5.69,...

A ma kdo kaksen predlog?

bigbada ::

narediš 2 generatorja, shraniš v polje in premešaš....

Eliminator ::

Nekak mi ne gre naredit da bi izpisovalo stevilke zaokrozene na eno decimalko.... Torej da bi generiralo stevila in jih zapisalo potem tako: 2.1,-9.3,4,-4......

A lahko kdo napise kaksen primer tu gor prosim


Hvala za pomoc:P

techfreak :) ::

math.h

Zgodovina sprememb…

Eliminator ::

kodo za izpis imam zaj tako:

void izpis(double polje[], int n)
{
    
    double random_stevila;
    srand(time(0));

    
    for(int i=0; i<n; i++)
    
    {

            random_stevila=rand()%21-10;
            polje[i]=random_stevila;
            cout<<i+ 1<<") "<<polje[i]<<" ";
            
    }
    
}


Zaj da bi jaz naredo da mi izpisuje stevila tak ko jaz hocem bi mogo recimo random stevila delit z 100. Samo potem se pojavi problem, ker potem sploh nebi generiralo celih stevil.... namesto 2 pa bi potem 0.02.

Jaz pa bi rad da bi generiralo vsa stevila med -10 pa 10... tako celostevična(1,-3,5) kot stevila tipa double.

A mi lahko kdo pomaga prosim

Sergio ::

Če je random število deljivo s sto, boš kot rezultat dobil celo število. Sam pač bo nekje vsako stoto število "randomly" celo. Sej to najbrž tut hočeš.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

Eliminator ::

   
for(int i=0; i<n; i++)
    
    {

            random_stevila=rand()%21-10;
            double a=random_stevila;
            double b=random_stevila/10;
            polje[i]=b,a;
            cout<<i+ 1<<") "<<polje[i]<<" "<<endl;
            
    }
    
}


Kaj pa kaj podobno temu se da naredit... To sem nekaj probavo,vendar ne dela... ne vem kak naj napisem da se boa in b zapisovalo v polje[i].

bigbada ::

2 for zanki narediš, ki generairana števila zapisujeta v array.

potem pa še eno for zanko, da izpišeš array.

Eliminator ::

Sedaj mi je koncno uspelo narediti, da mi izpisuje random stevila tipa double.

Sedaj pa se imam eno vprasanje.

Sedaj mi izpisuje stevila tako: -9.4357, 8.50432.....

A se da kako naredit, da bi izpisovalo: -9.4, 8.6.....

      srand((unsigned)time(0));
   
      double random_integer;
   
      double lowest=-9.0, highest=9;
   
      double range=(highest-lowest)+1;
   
      for(int index=0; index<200; index++){
   
      random_integer = lowest+double(range*rand()/(RAND_MAX + 1.0));
   
      cout << random_integer << endl;


Mi je ze uspelo...

Vseeno hvala

Zgodovina sprememb…

Eliminator ::

Kako pa bi naredil, da bi mi funkcija iskala v polju stevilo deljiteljev elmmentov v polju.
Primer:

Da bi v polje vstavil 5 stevil... (5,8,16,21,2....). Potem bi pa za vsako stevilo v polju izpisalo koliko ima deliteljev. (prvi element nima dobenega; drugi element ma:2,4......)

Spura ::

stevilo faktorjev iz katerih je stevilo sestavljeno ali stevilo razlicnih stevil s katerimi je deljivo?

Eliminator ::

Stevilo stevil s katerimi je stevilo v polju deljivo...
Recimo da mam v polju 10 stevil....

2,5,3,7,9,4,7,5,7,6

Zaj pa bi recimo po vrsti preverjalo koliko deliteljev ima stevilo 2,5,3,7,9,4,7,5,7,6.

pol bi pa napisalo da ma recimo stevilo 2 : 2 delitelja(1 pa 2); 5:2delitelja(1 pa 5);...stevilo 9:3delitelje(1,3,9)....

Spura ::

To sam mal spremenis enega od miljon primerov iskanja prastevil.

Eliminator ::

Ja samo ne vem kak potem naredis da za vsak element v polju poisce delitelje... Moras naredit kao eno for zanko da ti gre cez polje potem pa se eno for zanko da ti isce delitelje(prvi element v polju je 9, potem pa more drugi for it od 2 pa do 8 in deli stevilo 9 da najde delitelje... Potem prvi for gre na drugi element v polju(npr 10) in drugi for zopet gre od 2 pa do 9 itd... In sproti se mora shranjevat stevilo deliteljev nekam... da potem ves kero stevilo ima najvec deliteljev al pa da jih lahko zlozis po velikosti glede na stevilo deliteljev)

Zgodovina sprememb…

Eliminator ::

Jaz sem mislis nekako tako samo ne dela vredu.
void delitelji (int polje[], int n)
{
     for (int i = 0; i<n; i++)
     {
         for (int j=0; j<=polje[i]; j++)
         {
         if(polje[i] % j == 0)
         cout <<"Delitelj stevila "<< polje[i] <<" je: " <<j<<endl;
         }
     }

}

Spura ::

Delitelje posameznega stevila bi testiral v posebni funkciji. To ti tudi omogca lazje testiranje.
Narobe je to, da z j zacnes pri 0 ker z 0 ne smes delit.

J4zzm4n ::

Zdravo.
Jaz mam eno vprašanje glede funkcij v c++.
Zanima me če mogoče ve kaj je s tem mišljeno:
// Funkcija prebere kvadratno matriko realnih števil (velikosti od 2 do 30) v 2D polje

Bil bi hvaležen če bi mi kdo malo razložil to.
Hvala lp

keworkian ::

Prvo si poglej kaj pomenijo besede "funkcija", "kvadratna matrika", pa "2D polje", ostalo boš pa pomoje uspel ugotovit, če ne nehi studirat.
Obscenities in B-Flat

amacar ::

Torej program da uporabniku poziv naj vnese števila v matriko (npr v matriko 3x3 vnese 9 vrednosti, v 4x4 16 vrednosti...). Pred tem je verjetno potrebno dati še en poziv uproabniku, da naj vpiše v kakšno velikost matrike bo vpisoval ter mu onemogočiti, da bo vpisoval v matriko večjo kot 30x30. kvadratna matrika pa pomeni matrika, ki ima obe stranici enako dolgi, npr 3x3, 4x4.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] Naloge

Oddelek: Programiranje
273842 (2173) LordiBoy
»

največkrat pojavljeni element v tabeli

Oddelek: Programiranje
181845 (1220) pac1
»

Vprašanje v zvezi z rand() funkcijo

Oddelek: Programiranje
494894 (4084) fireice
»

JAVA - Math.random, kako določit interval?

Oddelek: Programiranje
205072 (2728) Sergio
»

Pomoč pri nalogi v C++

Oddelek: Programiranje
51288 (1288) bozjak

Več podobnih tem