Losowy podział odcinka

0

Cześć,

Napisałem program, który ma dzielić odcinek na n części o losowych długościach. Długość nowych odcinków ma sumować się do 1.
Chciałem prosić o wskazówki czy ten program, a właściwie kod mógłby działać lepiej bo szczerze mówiąc nie bardzo miałem pomysł na lepsze rozwiązanie niż to, które wstawiłem.
Poniżej polecenie i kod.

Napisz program section, który wczytuje ze standardowego wejscia dodatnia liczbe całkowita n, po czym
wypisuje na standardowe wyjscie n losowych liczb nieujemnych, które daja w sumie jeden. Program
załacza tylko pliki nagłówkowe cstdlib, ctime oraz iostream.
Przykładowe wykonanie
In: 3
Out: 0.54095 0.345354 0.113696

#include <iostream>
#include <ctime>
#include <cstdlib>

int main()
{
    int number;
    double a, b = 1, c = 0;

    do
    {
        std::cin >> number;
    }
    while (number <= 0);

    std::srand(std::time(nullptr));

    for (int i = 1; i < number; ++i)
    {
        a = ((double)rand() / RAND_MAX) * b;
        b = 1 - a;
        c += a;
        std::cout << a << " ";
    }

    std::cout << 1-c;
}
2

Problem w takim losowaniu jest taki, że wylosowane liczby nijak nie przypominają rozkładu jednostajnego. To co mogę zaproponować, to najpierw wylosować liczby, wstawić do tablicy, potem policzyć ich sumę, i wypisać po kolei każdą wartość podzieloną przez sumę. W ten sposób uzyskasz dużo lepszą losowość.

4

Szkoda, ze Was wykładowca krzywdzi (możesz mu podesłać: https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/ )

Osobiście wylosowałbym n liczb, policzył ich sumę a następnie wypisał każdą podzieloną przez tę sumę (alternatywnie dla ostatniej: 1 - suma dotychczas wypisanych).

0

Wielkie dzięki za wskazówki.
Z wpisaniem liczb do tablicy może być taki problem, że teoretycznie dział o wektorach jest działem następnym dlatego próbowałem napisać program w taki sposób aby uniknąć korzystania z tablicy. Niemniej jednak, jeszcze raz dzięki za rady.

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