[C++]Problematyczne losowanie

0
#include <iostream>
#include <stdlib.h>
using namespace std;
void main()
{
int k=0;
int tab[]={1,2,3};
int x1=0;
int x2=0;
int x3=0;
randomize();
// 1 LOSOWANIE
k=rand()%3+1;
x1=tab[k];
// 2 LOSOWANIE
do
{
        k=rand()%3+1;
        x2=tab[k];
}       while(k==x1);
// 3 LOSOWANIE
do
{

        k=rand()%3 +1;
        x3=tab[k];
}       while(k==x1 && k==x2);
cout<<"x1 = "<<x1<<endl;
cout<<"x2 = "<<x2<<endl;
cout<<"x3 = "<<x3<<endl;
system("pause");
}

hej jest to tylko fragment kodu który piszę, ale jest to dla mnie ważne bo to jest kluczowe w pewnym sensie.
Pytanie, dlaczego pomimo tego, że nie pozwalam na wylosowanie tego samego indexu do zmienne nadal mogą mieć te same wartości?</cpp>

0
usb napisał(a)
k=rand()%3+1;

Te "+1" jest zdecydowanie dużym błędem.
Po drugie coś namieszałeś porównywaniem wartości z indeksami.
Wygląda na to, że zapomniałeś że tablice w C indeksowane są począwszy od '0' a nie od '1'.

Po trzecie po co losujesz ostatni indeks skoro z góry wiadomo, że jest tylko jedna możliwość?

A i jeszcze na koniec popatrz tu.

#include <iostream>
#include <algorithm>
#include <cstdlib>
using namespace std;
void main()
{
    randomize();
    int tab[]={1,2,3};

    random_shuffle( tab, tab + 3 );

    for( int i =0; i<3; ++i )
        cout<<"x" << ( i+1 ) <<" = "<< tab[i] <<endl;

    system("pause");
}
0

skompiluj to zobaczysz:P

a mianowicie
jest 3 elementowa tablica;
losuje najpierw 1 element tablicy i przypisuje pod x1
z x2 chce zrobić to samo tylko żeby już wartość która została przypisana do x1 nie brała udziału w losowaniu (żeby się nie powtarzała)
podobnie z x3.

dzieki za pomoc
chociaż szczerze nie rozumiem random_shuffle pierwszy raz to na oczy widze ide w google

0
#include <iostream>
#include <ctime>
using namespace std;

int main()
{
  srand(time(0)); //sprawia ze wyniki są bardziej losowe
  const int rozmiar=10; //rozmiar / zakres wyników które chcemy uzyskać
  bool powtarza_sie; //zmienna logiczna która powie nam czy wylosowane liczby sie powtarzaja
  int wyniki[rozmiar]; //tablica na wyniki
  int tab[rozmiar]; //tabica na liczby z których będziemy losować

  for (int i=0;i<rozmiar;i++) //wypełnianie tablicy z której będziemy losować kolejnymi liczbami naturalnymi od 0 do rozmiar
    tab[i]=i+1;

  for (int i=0;i<rozmiar;i++) //i jest licznikiem elementów tablicy wyników
    {
      do
        {
          powtarza_sie=false; //zakładamy że sie nie powtórzą
          wyniki[i]=tab[rand()%rozmiar]; //(bo indeksy są od 0 a nie od 1) losujemy indeks i wybieramy liczbę z tablicy z danymi
          int j=0;
          while((j<i) and !powtarza_sie) //lecimy po wszystkich wypełnionych elementach (od 0 do i) chyba ze wczesniej sie powtorza
          {
            if (wyniki[i]==wyniki[j]) powtarza_sie=true; //jeśli jakiś ma taką wartość jak właśnie wylosowany to zmienna logiczna jest true
            j+=1; //przeskakujemy do kolejnego elementu
          }
        }
      while (powtarza_sie); //pętla wykona się tyle razy ile razy zmienna powtarza_sie przyjmie watosc true
    }

  for (int i=0;i<rozmiar;i++) //pętla wypisujaca wyniki
    cout<<"x"<<i+1<<" = "<<wyniki[i]<<endl;

  cin.get(); //zeby nam okienko nie znikało tylko czekalo na znak z klawiatury
  return EXIT_SUCCESS;
}

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