• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wybór randomowej linii z pliku tekstowego

+2 głosów
367 wizyt
pytanie zadane 7 listopada 2021 w C i C++ przez DaXari Początkujący (280 p.)

A więc chciałem zrobić wisielca, w którym zawsze musi być randomowe słowo. Próbowałem coś zrobić, ale ostatecznie się pogubiłem i zrobił się bajzel. Z tego co zrobiłem ostatecznie wynika że wylosowana liczba w ogóle nie bierze udziału w wyborze linii i nie wiem jak ją tam wkleić. Kod:

int nr_lini;
string linia;

int main()
{
    srand(time(NULL));
    nr_lini=rand()%20+1;
    nr_lini=rand()%20+1;
    nr_lini=rand()%20+1;
    nr_lini=rand()%20+1;

    fstream slowa;
    slowa.open("slowa.txt", ios::in);
    if(slowa.good()==false)
    {
       cout << "Taki plik nie istnieje!";
    }

    (getline(slowa, linia));
    {
        slowo=linia;
    }
    slowa.close();

    cout << slowo;

 

komentarz 8 listopada 2021 przez Sadako Obywatel (1,240 p.)

Hej

Jak chcesz losować z przedziału to nie używaj modulo (%) aby zawięzić zbiór. Gdy to zrobisz wprowadzasz "modulo bias" i Twój rozkład losowy nie jest już taki równy.
Zachcęcam do lektury dowolnego wyjaśnienie np. tutaj:

https://stackoverflow.com/questions/10984974/why-do-people-say-there-is-modulo-bias-when-using-a-random-number-generator

Dodatkowo, funkcja rand() jest dosyć "przewidywalna", dlatego do nauki jest spoko (bo jest prosta), ale nauczysz się złego designu. Do losowania liczb radzę użyć nowszych technik.

Tutaj przykład jak wylosować liczbę od 0 do 10000:

std::uniform_int_distribution<int> distribution(0, 10000);
std::random_device rd;
std::mt19937 engine(rd());
int randomNumber = distribution(engine);

(Powyższy fragment pochodzi z zasad SEI CERT dla C++, gdzie jest wytłumaczone, czemu rand jest niebezpieczny. Link tutaj: MSC50-CPP. Do not use std::rand() for generating pseudorandom numbers)

1 odpowiedź

+1 głos
odpowiedź 7 listopada 2021 przez Wiciorny Ekspert (282,600 p.)
    nr_lini=rand()%20+1;
    nr_lini=rand()%20+1;
    nr_lini=rand()%20+1;
    nr_lini=rand()%20+1;

czemu tyle razy nadpisujesz jedną zmienną, ostateczny wynik będzie i tak wykonaniem 4 lini 

W dalszej częsci kodu nigdzie nie używasz " nr_lini", tylko zmienną linia, która nie jest zainicjalizowana. 

komentarz 7 listopada 2021 przez DaXari Początkujący (280 p.)
Ale jak ostatecznie zrobić randomizera linii z pliku? :(
1
komentarz 7 listopada 2021 przez Wiciorny Ekspert (282,600 p.)
edycja 7 listopada 2021 przez Wiciorny
int count = 1;
While(count <= 3)
{
    random = rand() % 50;
    while(getline(File, line))
    {
        ++numOfLines;

        if(numOfLines == random)
        {
            cout << line;
        }
    }
    count++;
}

to jest też w miejscu, gdzie twoje rozwiązanie "w miare jest wyjasnione" tylko, że próbując je pisać samemu pomyliłeś nazwenictwo 

random = rand() % 50;
random1 = rand() % 50;
random2 = rand() % 50;
while(getline(File, line))
{
    ++numOfLines;

    if(numOfLines == random || numOFLines == random1 || numOfLines == random2)
    {
        cout << line;
    }
}

w myśl deklaracji zmiennej, potem inicjalizacji i jej braku użycia 

1
komentarz 7 listopada 2021 przez DaXari Początkujący (280 p.)
Dzięki wielkie
1
komentarz 7 listopada 2021 przez Wiciorny Ekspert (282,600 p.)
owocnej pracy.

Podobne pytania

0 głosów
1 odpowiedź 1,983 wizyt
pytanie zadane 26 marca 2021 w Nasze poradniki przez Dawidziu Bywalec (2,630 p.)
0 głosów
1 odpowiedź 1,280 wizyt
pytanie zadane 13 sierpnia 2019 w C i C++ przez Bulbi Początkujący (250 p.)
0 głosów
3 odpowiedzi 2,284 wizyt
pytanie zadane 18 października 2018 w Java przez Virius Początkujący (490 p.)

93,631 zapytań

142,553 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2459p. - CC PL
  9. 2184p. - Maurycy W
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1811p. - rafalszastok
  13. 1600p. - Rafał Trójniak
  14. 1588p. - Tomasz Bielak
  15. 1494p. - ssynowiec
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...