Hejsan Hej Urban Hej >"random_number" innehåller nu ett tal mellan 0 och RAND_MAX, exempelvis 230382. Man ska aldrig använda modulovarianten. Det får krävas ganska stora prestandakrav för att man skulle vilja det. Det finns två separata fördelningsproblem med modulovarianten, och ge rejält skev fördelning om det skulle vara så.Jag grötar till det när jag ska skapa slumptal
Försöker skapa slumptal i en array med konstant storlek.(ej dynamsik)
Men det går inte som jag har tänkt mig.
Kan någon se vad jag gör för fel!
OBS: Är nybörjare i c++, så detta är bara kod för att jag ska lära mig.(ingen direkt funktion)
Mvh
Urban
************Program************
#include <iostream>
#include "iodos.h"
using namespace std;
int main()
{
dos_console();
srand( time(0));
int range_low=0, range_high=0, random_integer=0, random_number;
cout << "Välj lägsta och högsta tal : ";
cin >> range_low >> range_high;
cout << "Antal slumptal :";
cin >> random_integer;
int range=(range_low-range_high)+1;
int random_array[126];
for(int i=0; i<random_integer; i++)
{
random_number = range_low+int(range*rand()/(RAND_MAX + 1.0));
random_array[i] = random_number;
}
for(int i=0; i<random_integer; i++)
{
cout<<random_array[i]<<endl;
}
return 0;
}
Sv: Jag grötar till det när jag ska skapa slumptal
Felet i din kod är raderna:
int range=(range_low-range_high)+1;
random_number = range_low+int(range*rand()/(RAND_MAX + 1.0));
Ändra dessa till:
int range = range_high - range_low + 1;
random_number = range_low + rand()%range;
<b>En liten förklaring:</b>
"rand()" ger ett tal mellan 0 och RAND_MAX (där RAND_MAX kan variera beroende på implementation).
Säg att du har:
int random_number = rand();
"random_number" innehåller nu ett tal mellan 0 och RAND_MAX, exempelvis 230382.
Hur gör vi nu för att få ett tal mellan ett visst interval?
Jo, vi använder modulus-operatorn (%), som ger oss resten vid en division.
number = random_number % value;
Detta genererar ett värde mellan 0 och value-1.
För att få ett värde mellan 0 och value, adderar vi alltså 1.
Då du ber användaren om ett interval, "range_low" till "range_high", så blir value:
value = range_high - range_low + 1;
Ett tal mellan 0 och range_high blir alltså:
number = rand()%value;
För att få värdet inom den rätta gränsen, adderar vi "range_low".
Hela raden blir alltså som följer:
random_number = range_low + rand()%(range_high - range_low + 1);
eller
random_number = range_low + rand()%value;
/ Peter
Sv:Jag grötar till det när jag ska skapa slumptal
Tack för all hjälp Peter.
Nu förstår jag lite mer i all kod-djungel.
Mvh
UrbanSv:Jag grötar till det när jag ska skapa slumptal
>Hur gör vi nu för att få ett tal mellan ett visst interval?
>Jo, vi använder modulus-operatorn (%), som ger oss resten vid en division.
modulus är enkel att använda men kom ihåg att den inte ger en jämn distribution (vissa värden har högre sannolikhet än andra).Sv: Jag grötar till det när jag ska skapa slumptal
Koden ska i princip vara rätt, jag ser några små fel.
int range=(range_low-range_high)+1;
random_number = range_low+int(range*rand()/(RAND_MAX + 1.0));
detta bör vara:
double range=(range_high-range_low)+1;
random_number = range_low+int(range*rand()/RAND_MAX);