Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C Liczby losowanie 3 kolejnych liczb z przedziału

Ostatnio zmodyfikowano 2018-11-16 00:26
Autor Wiadomość
gam3
Temat założony przez niniejszego użytkownika
» 2018-11-13 17:58:59
Sprawdzałem i kończy się również na 0,1,2. Chyba że chodzi o coś innego?
P-172854
jankowalski25
» 2018-11-13 22:12:04
1. Do zmiennej
los
 nie przypisujesz wartości początkowej, przez co w kolejnych krokach kopiujesz jakieś śmieci do
poprzednia1
, a następnie do
poprzednia2
.
2. Chodzi o taki przypadek:
obieg pętlilospoprzednia1poprzednia2
0śmieci-1-1
10śmieci-1
210śmieci
Całość zakończy się po wylosowaniu 0 1 przy założeniu, że przypadkowa wartość trafiająca do
los
 będzie wynosiła -1.

Co do rozwiązania: najprościej wylosować trzy liczby przed pętlą właśnie po to, aby nie kombinować z jakimiś magicznymi liczbami typu -1. Jakiej stałej byś nie wybrał, to i tak trafią się przypadki, gdzie po wczytaniu dwóch liczb całość się zakończy (bo ta trzecia będzie z góry ustalona i dobranie dwóch kolejnych jest trywialne, dla -1 są to właśnie 0 i 1).
P-172858
pekfos
» 2018-11-14 16:59:58
Jakiej stałej byś nie wybrał, to i tak trafią się przypadki, gdzie po wczytaniu dwóch liczb całość się zakończy
Nigdy nie wylosuje mniejszej liczby niż zero, wiec stałe mniejsze od -1 są bezpieczne.
P-172861
madpl1239
» 2018-11-14 19:40:15
Hmm.... z twojego pierwszego posta, miało wynikać że program losuje z przedziału <0, 10> tak długo aż wylosuje sekwencję
3 kolejnych liczb. To co teraz widzę chyba sporo odbiega od tzw. specyfikacji problemu?

Po prostu się pogubiłem jakiego algorytmu szukasz:))))

Pozdrawiam
P-172862
pekfos
» 2018-11-14 19:43:34
Dlaczego odbiega?
P-172863
madpl1239
» 2018-11-14 20:02:15
Cytuję:

gam3 napisał:
Dzieki wielkie za podpowiedzi. Nie wiem czemu ciągle myślałem nad losowaniem w jednej zmiennej XD
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    int los, los2, los3;
    srand( time( NULL ) );
  
    los = rand() % 11;
    los2 = rand() % 11;
    los3 = rand() % 11;
    while( los != 2 || los2 != 3 || los3 != 4 )
    {
        los = rand() % 11;
        los2 = rand() % 11;
        los3 = rand() % 11;
        printf( "%3d\n", los );
        printf( "%3d\n", los2 );
        printf( "%3d\n", los3 );
    }
  
  
  
  
    return 0;
}

z tego algorytmu powyżej wynika, że liczby wylosowane mają być 2, 3 i 4:)))
Chociaż mam wątpliwości co do poprawności warunku while. Bo z tego warunku wynika, że wystarczy spełnić np: pierwszy "los != 2" żeby ta alternatywa logiczna była prawdziwa i kompilator może już dalej wcale nie sprawdzać warunków:)))) czy to nie będzie "pluskwą"?
P-172864
pekfos
» 2018-11-14 21:00:02
z tego algorytmu powyżej wynika, że liczby wylosowane mają być 2, 3 i 4:)))
To już zostało wyjaśnione.

z tego warunku wynika, że wystarczy spełnić np: pierwszy "los != 2" żeby ta alternatywa logiczna była prawdziwa i kompilator może już dalej wcale nie sprawdzać warunków:))))
I co z tym nie tak?
P-172865
qwertyui
» 2018-11-16 00:26:44
Moze nie jest to zbyt elegancie rozwiazanie, badz co badz wedlug mnie dziala i o to chodzilo autorowi:

C/C++
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

using namespace std;

int main()
{
    srand( time( 0 ) );
    int frst, scnd, thrd, number;
    int i = 0;
    bool roll = true;
    while( roll )
    {
        if( i == 0 )
        {
            frst = rand() % 11;
            number = frst;
        }
        else if( i == 1 )
        {
            scnd = rand() % 11;
            number = scnd;
            if( frst + 1 != scnd )
            {
                i = 0;
                continue;
            }
        }
        else if( i == 2 )
        {
            thrd = rand() % 11;
            number = thrd;
            if( scnd + 1 != thrd )
            {
                i = 0;
                continue;
            }
            else roll = false;
           
        }
        printf( "%i \n", number );
       
        i++;
        if( i > 2 ) i = 0;
       
    }
   
    printf( "\n\n%i\n", frst );
    printf( "%i\n", scnd );
    printf( "%i\n", thrd );
    return 0;
}
P-172875
1 2 « 3 »
Poprzednia strona Strona 3 z 3