Archief - [PROG](C++) random number

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

ArnoDF

Legacy Member
Iemand die een goeie manier kent om een random number te 'generaten' met iso c++. randomize is spijtig genoeg enkel voor borland (ik gebruik mingw(winblows) en gcc (linux) ).
rand en srand kunnen blijkbaar geen random maken tussen bepaalde getallen, bv tussen 0 en 7. Het moet vooral zowel op linux als op windows werken (wel op elk apart compilen natuurlijk) dus zonder gebruik te maken van mfc, wxWidgets enz.

Thx

Tyfius

Legacy Member
Dan heb je dat toch blijkbaar niet goed bekeken.
10 random cijfers tussen 1 en 7:
Code:
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

int main(int argc, char *argv[])
{
    srand((unsigned)time(0));
    int rand_int    = 0;
    int lowest      = 1;
    int highest     = 7;

    int range = (highest - lowest) + 1;

    for (int i = 0; i < 10; i++) {
        rand_int = lowest + int((double)range * rand() / (double)(RAND_MAX + 1.0));
        cout << "Random integer: " << rand_int << endl;
    }

    return 0;
}

Vich

Legacy Member
Dit schreef ik:
Code:
int RandomInt(int inMin, int inMax)
{
	int difference = inMax - inMin;
	return ( rand() % (difference + 1) ) + inMin;
}
 
float RandomFloat(float inMin, float inMax)
{
	float random = (float)rand() / RAND_MAX;
	return ((inMax - inMin) * random) + inMin;
}

Het is afaik ANSI C/C++ en dus volledig platform-onafhankelijk. (werkt prima in Windows, Linux en op de Nintendo DS)

Bron:
http://cow.svn.sourceforge.net/viewvc/cow/trunk/Source/COW/CowUtils.cpp?revision=42&view=markup
(GPL)


@ Tyfius: In die oplossing wordt van int naar float geconverteerd en dan terug naar int. Het zal vast werken, maar dat is niet echt een goede manier van werken. De code wordt er ook niet leesbaarder door.

@ Keats: Je span moet highest-lowest+1 zijn, omdat je anders nooit je highest kan krijgen als maximum random waarde.

KeaTs

Legacy Member
Aye, hangt af van je definitie van 'tussen'. Ik ben gewend aan 0-6 als ik zeg 'tussen 0 en 7', teveel met arrays gewerkt I guess, maar je hebt ntl gelijk :)

Tyfius

Legacy Member
Mja, inderdaad. Mijn code is niet zo proper. Allee ja, mijn code. Eerste Google resultaat en gewoon eens gecontroleerd voor de zekerheid :)

ArnoDF

Legacy Member
Code van Vich gebruikt, hij geeft altijd 41 als ik compile met mingw

Ice

Legacy Member
ArnoDF zei:
Code van Vich gebruikt, hij geeft altijd 41 als ik compile met mingw

moet ge rand niet initialiseren met een of anderen seed? (bv current time in millis) omdat ge anders altijd dezelfde sequence gaat krijgen?

killgore

Legacy Member
Ice zei:
moet ge rand niet initialiseren met een of anderen seed? (bv current time in millis) omdat ge anders altijd dezelfde sequence gaat krijgen?

inderdaad :). De random generators zijn niet meer dan een rij getallen die na zoveel keer terug komen, met de seed wijzig je dan welk getal je als eerste neemt.

Vich

Legacy Member
KeaTs zei:
Aye, hangt af van je definitie van 'tussen'. Ik ben gewend aan 0-6 als ik zeg 'tussen 0 en 7', teveel met arrays gewerkt I guess, maar je hebt ntl gelijk :)

Men doet meestal ofwel ]0, 7[ ofwel [0, 7] Het laatste is wat ik doe. Wat jij bedoelt is [0, 7[ en dat is natuurlijk redelijk inconsistent voor een random number generator. Natuurlijk is het handig om zo te werken voor arrays, maar dan nog zou ik de [0, 7] manier gebruiken en deze gewoon anders invullen.
(de voorbeelden zijn in de veronderstelling dat je met gehele getallen werkt)

Tyfius zei:
Dat staat in mijn stuk code, die srand().

Geef je dan ook elke keer een nieuwe random seed mee? Bijvoorbeeld de tijd? (wat Ice dus zei)

Bijvoorbeeld:
srand((unsigned int)time(NULL));
(je moet cstdlib en time.h includen om het te laten werken)

MilM

Legacy Member
Vich zei:
Men doet meestal ofwel ]0, 7[ ofwel [0, 7] Het laatste is wat ik doe. Wat jij bedoelt is [0, 7[ en dat is natuurlijk redelijk inconsistent voor een random number generator. Natuurlijk is het handig om zo te werken voor arrays, maar dan nog zou ik de [0, 7] manier gebruiken en deze gewoon anders invullen.
(de voorbeelden zijn in de veronderstelling dat je met gehele getallen werkt)

Standaardklasse van Java is [0,x[
Dus ik kan mij best voorstellen dat sommigen dit overnemen als ze plots in C++ schrijven.

Veel doet het er niet toe, als men het erbij zet.

killgore

Legacy Member
MilM zei:
Standaardklasse van Java is [0,x[
Dus ik kan mij best voorstellen dat sommigen dit overnemen als ze plots in C++ schrijven.

Veel doet het er niet toe, als men het erbij zet.

Mja, die van java is wel een floating point generator.

Imho komt het op syntaxis aan:
min, max -> duidelijk [min,max]
from, to -> kan zowel [from,to] als [from,to[ zijn imho, gewoon documentatie van die lib bekijken.

MilM

Legacy Member
killgore zei:
Mja, die van java is wel een floating point generator.

Imho komt het op syntaxis aan:
min, max -> duidelijk [min,max]
from, to -> kan zowel [from,to] als [from,to[ zijn imho, gewoon documentatie van die lib bekijken.

Klasse Random hé (uit util package)

Nie de methode uit de Math klasse. Die gebruik ik in feite nooit.
Alhoewel het soms wel handig kan zijn, aangezien het een statische is.

killgore

Legacy Member
MilM zei:
Klasse Random hé (uit util package)

Nie de methode uit de Math klasse. Die gebruik ik in feite nooit.
Alhoewel het soms wel handig kan zijn, aangezien het een statische is.

Ah, ok, verkeerd verstaan dan ;). Nuja, die uit math is ook [0,1[

killgore

Legacy Member
Zeg, aanvullend: kent iemand hier een goede generator voor floats (dus een rij he, zelf te schrijven formule, geen functies :p).

MilM

Legacy Member
Ik heb er nie echt over nagedacht, dus schiet mij nie af als het te eenvoudig is :p

Mss kunt ge gewoon een integer tussen [1,x] genereren (noem dit a) en dan 1/a returnen.
Wanneer ge uw klasse aanmaakt, kunt ge dan mss x als parameter meegeven.

Hoe groter x, hoe meer verschillende floats je zal kunnen genereren.

Of mss beter, een getal tussen [0,x].
Wanneer je 0 krijgt, dan return je 0, anders 1/a

Een generator vinden die aan veel statistische eigenschappen voldoet, zal wel wa ingewikkelder zijn vermoed ik :p

EDIT: laat dus maar zitten
Nog eens over nagedacht en tis dus een zeer slecht algoritme
Aangezien je telkens maar één deelinterval opnieuw gaat onderverdelen.
Maw, je zal niets kunnen genereren tussen 0,5 en 1

Wat eventueel wel zou gaan is (1/x)*a
Maar mss kijk ik weer iets over het hoofd ? :p

(nog verre van perfect natuurlijk aangezien het allemaal veelvouden zijn en uw minimum afhangt van x, maar al beter)
Mss dat je x dan ook nog eens kunt laten genereren (wel groot genoeg) ipv een vaste waarde die als parameter wordt opgegeven
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan