Zakres rand()

0

Mam dwa pytania:

  1. Czy ktos wie w jakim pliku znajduje się definicja tej funkcji biblioteki standardowej (stdlib.h) ?
  2. Wg stdlib.h zakres rand jest oreślony poprzez makro #define RAND_MAX 0x7FFF, problem w tym, że jak zmienię 0FFF na cos większego to i tak nie losuje liczb większych niż 7FFF. Czemu?
0

W codeblocksie standardowy GNU GCC Compiler

mingw32-g++.exe, więc chyba 32

8

Ta definicja jest dla ciebie, żebyś wiedział jaki jest maksymalny wynik rand(), a nie żebyś nim sterował.

side note: https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/

3

Skoro to C++ to zamiast używać rand używaj biblioteki random (https://en.cppreference.com/w/cpp/header/random)
Jeśli nie wiesz jak z nią zacząć polecam https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/
Co do RAND_MAX nie u standaryzowano jaką może mieć wielkość, jedyne co wiadomo to że It's guaranteed that this value is at least 32767 (https://en.cppreference.com/w/cpp/numeric/random/RAND_MAX), co oznacza że w zależności od kompilatora może to być wartość większa niż 0x7FFF ale nie musi

0

@kq:, @plx211:

No dobra, coś tam pokombinowałem używając tego randutils oraz różnych rozkładów stąd: http://www.cplusplus.com/reference/random/lognormal_distribution/
ale np przy użyciu randutils i rozkładu mt19937 dałem zakres od 0 do 32 milionów i przy 5000 prób wszystkie wyniki sa powyżej miliona a nie bardzo o to mi chodzi :(

0

To albo coś popsułeś, albo jesteś najbardziej pechową osobą na Ziemi. Pokaż kod.

EDYCJA: a mt19937 to nie dystrybucja, tylko generator pseudolosowy. Dystrybucja to, na przykład, jednorodna na całkowitych (niemal na pewno chcesz właśnie tę) czy ten rozkład logarytmiczno-normalny, do którego zalinkowałeś.

0

Jutro wrzucę (jednorodna albo rozkład normalny mnie najbardziej interesuje)

0

Możesz z braku lepszego rozwiązania w razie potrzeby użyć dwukrotnie i połączyć wynik w większą całość.

0

``
#include "randutils.hpp"
#include <iostream>

int main()
{
randutils::mt19937_rng rng;
randutils::default_rng def;

std::cout << "Greetings from Office #" << def.uniform(0,32000000)
          << " (where we think PI = "  << rng.uniform(3.1,3.2) << ")\n\n"
          << "Our office morale is "   << rng.uniform('A','D') << " grade\n"
          << "We " << rng.pick({"welcome",
                                "look forward to synergizing with",
                                "will resist",
                                "are apathetic towards"})
                   << " our management overlords\n\n";

std::cout << "On the 'business intelligence' test, we scored "
          << rng.variate<double,std::normal_distribution>(70.0, 10.0)
          << "%\n";

std::cout << std::endl << "START: " << std::endl;
          for (int i=0; i<5500; ++i)
            {
double number = rng.uniform(0,32000000);
float number2 = number;
int number3 = number;
std::cout << number3;
if (number > 32767 && number < 132767) std::cout << "   pow 7FFF";
else if (number > 132767 && number < 532767) std::cout << " pow 132k";
else if (number > 532767 && number < 1132767) std::cout << " pow 500k";
else if (number > 1132767) std::cout << " pow 1M";
std::cout << std::endl;

}
}
``

I to jest skopiowane ze storny krzaqa, lekko zmienione.

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