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

brak efektu wyjsciowego

Object Storage Arubacloud
0 głosów
190 wizyt
pytanie zadane 28 grudnia 2019 w C i C++ przez NieMaJuzNazw Użytkownik (890 p.)

proboje nadal zrobic program ale napotkalem problem. mam taki kod: 

#include <iostream>
#include <time.h>
using namespace std;
int talia[54],taliaP[54];

int l1,l2,x,g,mg,j;
int main()


{
srand((int)time(NULL));
    for (int n=0;n<=53;n++)
    {
        talia[n]=n+1;
    }



        for (int i=0;i<=53;i++)
    {
        for ( j=0;j<=1;j++)
            l2 = rand()%54;
        taliaP[i]=talia[l2];
            for (int mo=0;mo<=53;mo++)
            {
                if (taliaP[i]==taliaP[mo])
              {
                  i--;
                  

              }
    }

    }



    for (x=0;x<=53;x++)
    {
        cout<<taliaP[x]<<endl;
    }



        return 0;
}

i teoretycznie program powinien przypisać do tablicy taliaP losowe liczby do tablicy talia bez powtórzeń ale liczby sie powtarzają

komentarz 29 grudnia 2019 przez pcalus Użytkownik (920 p.)

Przyznam, że nie rozumiem co ma robić ten program. Z kodu nie wynika, a po przeczytaniu opisu też nie wiem, jak jest cel.

Strasznie dziwnie wygląda to cofanie i. Na moje oko, z dużym prawdopodobieństwem wartość może schodzić do wartości ujemnych, a chyba nie taki był cel?

for (int mo=0;mo<=53;mo++)
{
    if (taliaP[i]==taliaP[mo])
    {
        i--;
    }
}

Może za dużo wyciąłeś z pierwotnego kodu?

komentarz 29 grudnia 2019 przez NieMaJuzNazw Użytkownik (890 p.)
Tak jak napisałem to miało być przypisywanie do jednej tablicy losowe liczby z drugiej tablicy, kod który tu zacytowałes miał sprawdzać czy cyfra się nie powtórzyła, jeśliby się powtorzyla to odjęłoby się 1 od zmiennej i, która jest w zmiennej for I spowodowałoby wykonanie tego jeszcze raz I tak do momentu aż przypisze losowa liczbę której jeszcze nie było
komentarz 29 grudnia 2019 przez mokrowski Mędrzec (155,460 p.)

@NieMaJuzNazw, nie rozumiem celu programu. Napisz wyraźnie co chcesz osiągnąć. Jeśli chcesz mieć wartości losowe bez powtórzeń, to z jakiego przedziału, ile i czy są ograniczenia (pamięć czy szybkość wykonania).

komentarz 29 grudnia 2019 przez NieMaJuzNazw Użytkownik (890 p.)
Celem programu jest przepisanie danych z jednej tablicy do drugiej w losowej kolejności, tablica pierwsza zawiera liczby od 1-54

3 odpowiedzi

0 głosów
odpowiedź 29 grudnia 2019 przez Tymot372 Nowicjusz (220 p.)
Funkcja rand pobiera te liczby z zegara systemowego, dlatego są to liczby pseudolosowe. Pobierając dwie liczby w tym samym czasie wyjdą ci te same liczby.

Funkcja ma sens tylko wtedy, gdy pomiędzy losowaniem 1 a 2 liczby jest jakaś przerwa.
komentarz 29 grudnia 2019 przez NieMaJuzNazw Użytkownik (890 p.)
Tak wiem, ale po to dałem kod który miał sprawdzać czy liczba się nie powtórzyła
0 głosów
odpowiedź 29 grudnia 2019 przez mrspock1 Mądrala (6,420 p.)
Ogólnie losowanie bez powtórzeń z tablicy polega na tym, że losujesz element tablicy i następnie ostatni element tablicy przesuwasz na miejsce wylosowanego a następnie skracasz tablicę o jedną pozycję.
0 głosów
odpowiedź 29 grudnia 2019 przez mokrowski Mędrzec (155,460 p.)

Ok. Pomijając fakt że co do rand(), wszyscy obecnie mają jak najgorsze zdanie (i słusznie), pomijając także fakt że masz od tego już gotowy algorytm w bibliotece standardowej C++ ( https://en.cppreference.com/w/cpp/algorithm/random_shuffle ), rozumiem że masz to zrobić ręcznie i koniecznie rand(...) bo "tak kazali".

No to:

1. Generujesz talię.

2. Przepisujesz wygenerowaną talię do kontenera wynikowego (1:1).

3. Przechodzisz od pierwszego elementu do ostatniego zamieniając go z innym losowym z całego zakresu kontenera.

No to wersja za którą pochwalą "że dobrze" a jest "nie bardzo".. choć już coś poprawione:-/:

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

int main()
{
    srand(time(NULL));
    int talia[54];
    int taliaP[54];

    // Generowanie talii
    for(int n = 0; n < 54; ++n)
    {
        talia[n] = n + 1;
    }

    // Kopiowanie talii do docelowej
    for(int n = 0; n < 54; ++n)
    {
        taliaP[n] = talia[n];
    }

    // Tasowanie talii
    for(int n = 0; n < 54; ++n)
    {
        int result_index = rand() % 54;
        int tmp = taliaP[result_index];
        taliaP[result_index] = taliaP[n];
        taliaP[n] = tmp;
    }

    // Wyświetlenie potasowanej talii
    for(int n = 0; n < 54; ++n)
    {
        std::cout << taliaP[n] << ' ';
    }
    std::cout << '\n';

    return 0;
}

Uwagi:

1. Dlaczego indeksy są ze znakiem? Czy ma sens użycie indeksów ujemnych?

2. Dlaczego pierwotnie w pętlach jest postinkrementacja? Po co kazać kompilatorowi trzymać starą wartość jeśli nie będzie użyta?

3. Dlaczego jest wartość magiczna 54? Co ona oznacza?

4. Dlaczego nie ma funkcji tylko "tłumaczenie co robi kawałek kodu"? To funkcja ma tłumaczyć.

5. Po co return 0 z main(...) kiedy w C++ od dawna wiadomo że jak nie ma return w main(...), to sam kompilator wygeneruje zwrócenie 0?

No ale co do pretensji, sam się ustosunkuj :)

 

Podobne pytania

0 głosów
1 odpowiedź 237 wizyt
pytanie zadane 12 października 2018 w Sprzęt komputerowy przez Votex Początkujący (310 p.)
0 głosów
1 odpowiedź 704 wizyt
0 głosów
2 odpowiedzi 433 wizyt
pytanie zadane 19 stycznia 2019 w HTML i CSS przez Grzegorz Mikina Dyskutant (8,060 p.)

92,563 zapytań

141,416 odpowiedzi

319,596 komentarzy

61,948 pasjonatów

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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...