[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Hania_87
Użytkownik
Użytkownik
Posty: 860
Rejestracja: 18 cze 2007, o 20:57
Płeć: Kobieta
Lokalizacja: Rybnik
Podziękował: 86 razy
Pomógł: 57 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Hania_87 »

pierwsza wersja, jest ze zwracaniem

Kod: Zaznacz cały

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace losowanie
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] tab = new int[6];
            Random gen=new Random();
            for (int i = 0; i < 6; i++)
            {
                tab[i] = gen.Next(1, 49);
                    Console.Write("{0}; ",tab[i]);
            }
            Console.ReadKey();
        }
    }
}
poprawiona wersja (druga), lecz nie do końca poprawna

Kod: Zaznacz cały

    class Program //losowanie 6 różnych liczb z 49
    {
        static void Main(string[] args)
        {
            Random r = new Random();
            int[] tab = new int[6];
            for (int i = 0; i < tab.Length; i++)
            {
                tab[i] = r.Next(1, 49);
                for (int j = 0; j < i; j++)
                    if (tab[i] == tab[j])
                        while (tab[i] == tab[j])
                            tab[i] = r.Next(1, 49);
            }
            foreach (int i in tab)
                Console.Write("{0}   ", i);
            Console.ReadKey();
        }
    }

trzecia wersja (mam nadzieje, że jest dobra)

Kod: Zaznacz cały

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace losowanie_6_z_49
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] tab = new int[6];
            Random gen=new Random();

            int i=0;
            while (i < 6)
            {
                int wylosowana_liczba = gen.Next(1, 49); //losuje liczby
                if (!tab.Contains(wylosowana_liczba)) //sprawdza czy już jest, nie ma wpisujemy jest od nowa
                {
                    tab[i] = wylosowana_liczba;
                    i++;
                }
            }
            foreach (int liczba in tab) //wypisuje
            {
            Console.Write("{0} ", liczba);
            }

            Console.ReadKey();
        }
    }
}
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Dedemonn »

??

Rozumiem, że to takie pochwalenie się programami tylko? Zadnych pytań, wątpliwości nie widzę.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: soku11 »

Nie znam sie na C#, ale skladnia podobna jak w kazdym jezyku, wiec moge pomoc :)
Drugi sposob jest niepoprawny, gdyz po znalezieniu kolizji, losowana jest kolejna liczba, az tej kolizji w danym elemencie tablicy nie bedzie. Jednak po zmianie tej liczby moze pojawic sie kolizja z innym 'niezaleznym' elementem tablicy.
Trzeci sposob dziala, choc jest jak dla mnie troche niepoprawny, bo program dla lipnego generatora (ktorego rozklad sporo odbiega od rozkladu jednostajnego) i duzo wiekszej tablicy moze dzialac bardzo dlugo.
Proponuje takie rozwiazanie:
Tworzysz sobie jakas tablice z cyframi z ktorych chcesz losowac (u ciebie od 1 do 49, czyli tablice 49 elementow). Robisz zmienna okreslajaca ile juz wylosowano liczb (zaczynamy oczywiscie od 0).
Teraz losowanie odbywa sie poprzez wybor miejsca w tej tablicy. Pierwsze losowanie - od pozycji 0 do 48. Wylosowana liczbe, powiedzmy z 5 komorki (bedzie to zapewne 6) zamieniamy z ostatnia liczba w tablicy (zapewne 49) i inkrementujemy ilosc wylosowanych juz liczb. Dalej losujemy z 48 miejsc (ostatnie zajmuje juz wylosowana liczba).
W kodzie moze to wygladac tak:

Kod: Zaznacz cały

  static void Main(string[] args)
  {
    int[] data=new int[49];
    int wylosowano=0;
    int[] wynik=new int[6];
    Random generator=new Random();

    foreach(int i in data)    // inicjalizacja danych (liczb od 1 do 49)
      data[i]=i+1;

    foreach(int i in wynik)
    {
      // losujemy miejsce w tablicy danych
      int miejsce=generator.Next(0,data.Length-1-wylosowano);
      result[i]=data[miejsce];  // wpisujemy do wyniku

      // wrzucamy wylosowany element na koniec
      data[miejsce]=data[data.Length-1-wylosowano];
      data[data.Length-1-wylosowano]=result[i];
      ++wylosowano;
    }
  }
Oczywiscie nie sprawdzane, ale powinno dzialac :)
Pozdrawiam.
Hania_87
Użytkownik
Użytkownik
Posty: 860
Rejestracja: 18 cze 2007, o 20:57
Płeć: Kobieta
Lokalizacja: Rybnik
Podziękował: 86 razy
Pomógł: 57 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Hania_87 »

czy program drugi jest poprawny, czy jak soku11 powiedział?
i czy program trzeci jest dobrze?
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: soku11 »

No przeciez napisalem, ze dziala. Zreszta wystarczy go uruchomic, by zobaczyc rezultaty

Pozdrawiam.
Hania_87
Użytkownik
Użytkownik
Posty: 860
Rejestracja: 18 cze 2007, o 20:57
Płeć: Kobieta
Lokalizacja: Rybnik
Podziękował: 86 razy
Pomógł: 57 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Hania_87 »

czepia się program result, i wyskakuje błąd
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Dedemonn »

Jak się można domyślić, zastąp 'result' na 'wynik'.

PS. Dzięki soku11 za poznanie nowej metody losowania bez powtórzeń. ;]
Hania_87
Użytkownik
Użytkownik
Posty: 860
Rejestracja: 18 cze 2007, o 20:57
Płeć: Kobieta
Lokalizacja: Rybnik
Podziękował: 86 razy
Pomógł: 57 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Hania_87 »

i tak nie działa, sprawdzałam
i wpisałam na końcu

Kod: Zaznacz cały

Console.ReadKey();
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Dedemonn »

Kod: Zaznacz cały

foreach(int i in data)    // inicjalizacja danych (liczb od 1 do 49)
    data[i]=i+1;
Zastąp na:

Kod: Zaznacz cały

for(int i=0; i < data.Length; i++)
    data[i] = i+1;

Pierwsza pętla jest niepoprawna, ponieważ dla każdej WARTOŚCI liczby o indeksie WARTOŚĆ z tablicy data przypisuje jej swoją wartość + 1 -> to tak jeśli potrzebne są jakieś wyjaśnienia.
Ostatnio zmieniony 17 cze 2009, o 11:15 przez Dedemonn, łącznie zmieniany 1 raz.
Hania_87
Użytkownik
Użytkownik
Posty: 860
Rejestracja: 18 cze 2007, o 20:57
Płeć: Kobieta
Lokalizacja: Rybnik
Podziękował: 86 razy
Pomógł: 57 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Hania_87 »

:/

Kod: Zaznacz cały

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace soku111
{
    class Program
    {
      
              static void Main(string[] args)
  {
    int[] data=new int[49];
    int wylosowano=0;
    int[] wynik=new int[6];
    Random generator=new Random();

    for (int i = 0; i < data.Length; i++)
        data[i] = i + 1;

    foreach (int i in wynik)
    {
        // losujemy miejsce w tablicy danych
        int miejsce = generator.Next(0, data.Length - 1 - wylosowano);
        wynik[i] = data[miejsce];  // wpisujemy do wyniku

        // wrzucamy wylosowany element na koniec
        data[miejsce] = data[data.Length - 1 - wylosowano];
        data[data.Length - 1 - wylosowano] = wynik[i];
        ++wylosowano;

    }
    Console.ReadKey();
    }
    }
    }
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Dedemonn »

Wystarczyło zapewne tylko zamienić drugiego foreacha na tradycyjnego, ale sprawdziłem całość. Masz działający:

Kod: Zaznacz cały

		int[] data = new int[49];
		int[] wynik = new int[46];
		int wylosowano = 0;
		Random generator = new Random();

		for (int i = 0; i < data.Length; i++)
			data[i] = i + 1;

		for(int i=0; i < wynik.Length; i++)
		{
			int miejsce = generator.Next(0, data.Length-1-wylosowano);
			wynik[i] = data[miejsce];  // wpisujemy do wyniku

			data[miejsce] = data[data.Length - 1 - wylosowano];
			data[data.Length - 1 - wylosowano] = wynik[i];
			++wylosowano;
		}
		
		Console.ReadKey();
A teraz zachęcam do dogłębnej analizy działania programu i zrozumienia jak działa i co robi, a nie przeklejenie go i oddanie itd.
Hania_87
Użytkownik
Użytkownik
Posty: 860
Rejestracja: 18 cze 2007, o 20:57
Płeć: Kobieta
Lokalizacja: Rybnik
Podziękował: 86 razy
Pomógł: 57 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Hania_87 »

gdzie Ci losuje te liczby?
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Dedemonn »

Kod: Zaznacz cały

int miejsce = generator.Next(0, data.Length-1-wylosowano);
Metoda Next obiektu klasy Random zwraca losową wartość całkowitą z przedziału (0, data.Length-1-wylosowano).
Hania_87
Użytkownik
Użytkownik
Posty: 860
Rejestracja: 18 cze 2007, o 20:57
Płeć: Kobieta
Lokalizacja: Rybnik
Podziękował: 86 razy
Pomógł: 57 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Hania_87 »

nie chodziło mi o wskazanie linijki w programie, lecz o działanie programu
Awatar użytkownika
Dedemonn
Użytkownik
Użytkownik
Posty: 689
Rejestracja: 21 lut 2007, o 19:40
Płeć: Mężczyzna
Lokalizacja: Z kompa
Podziękował: 26 razy
Pomógł: 137 razy

[C#] program losujący 6 różnych cyfr z 49 bez zwracania

Post autor: Dedemonn »

Hania_87 pisze:GDZIE Ci losuje te liczby?
To jest pytanie o działanie programu? No przepraszam...

Do tego soku11 już odpowiedział na Twoje powyższe pytanie.
ODPOWIEDZ