Usuwanie duplikatów losowych liczb

2018-11-16 22:08
0

Cześć. Chcę zapełnić tablicę liczbami pseudolosowymi, ale tak, żeby nie było w niej duplikatów. Nie mam pojęcia czemu program nigdy nie chcę wejść do pierwszego warunku if'a. Proszę o pomoc.

            Random losowa = new Random();
            int[] tablica; tablica = new int[6];
            bool exit;

            for (int i = 0; i < tablica.Length; i++)
            {
                exit = false;
                tablica[i] = losowa.Next(1, 10);

                while (!exit) //excluding the possibility of 2 the same numbers
                {
                    for (int j = 0; j < tablica.Length; j++)
                    {
                        if (tablica[i] == tablica[j] && i != j) tablica[i] = losowa.Next(1, 10);
                        else exit = true;
                    }
                }
edytowany 1x, ostatnio: furious programming, 2018-11-16 22:20
Prościej byłoby użyć Listy + .Contains() oraz A co jeżeli to drugie losowanie też da liczbę, która już jest? :P - WeiXiao 2018-11-16 22:11
Zostanie sprawdzona ponownie, bo program z while'a nie wyjdzie. Czy się mylę? - Joff3R 2018-11-16 22:20
@WeiXiao: na temat odpowiadamy w postach – prosiłem już o to. - furious programming 2018-11-16 22:20

Pozostało 580 znaków

2018-11-16 22:24
0

Spróbuj tak:

Random losowa = new Random();
var lista = new List<int>();
int size = 6;

for (int i=0; i<size; i++)
{
    int losowa_wartosc;
    do
    {
        losowa_wartosc = losowa.Next(1, 10);
    } while (lista.Contains(losowa_wartosc));

    lista.Add(losowa_wartosc);
}

@Joff3R: A jednak nie :P

Masz takie liczby w tablicy 1,2,3

Teraz wylosowałeś liczbę 1 na index i=3, ale 1 już istnieje na indexie 0, więc losujesz i znów wypada 1 i zostaje ona na indexie 3.
Pętla leci dalej do końca i wychodzi, bo exit = true

Możesz dać w tym ifie sprawdzenie na liczbę przed wylosowaniem i po, a na końcu wyświetlić wszystkie wartości i sprawdzić czy są dwie takie same

edytowany 5x, ostatnio: WeiXiao, 2018-11-16 22:48
@Joff3R: jednak był tam bug :P - WeiXiao 2018-11-16 22:43
Zostaje na indexie 3, ale dlaczego potem leci do końca? Wchodzi znowu na for i jest Od razu spełniony warunek tablica[3]==tablica[0], więc losuje ponownie 3 index - Joff3R 2018-11-16 22:48
@Joff3R: w tym środkowym forze. łap "Debug log" https://pastebin.com/uAtGpYed - WeiXiao 2018-11-16 23:01
Ok, już rozumiem. Dziękuję :) - Joff3R 2018-11-16 23:08
@Joff3R: a to spoko jak już masz, bo chciałem tego loga poprawiać, bo w sumie brzydki jest i brakuje kilku rzeczy żeby łatwiej było to odczytać :D W ogóle mógłbyś ten kod ze sprawdzaniem wydzielić do jakiejś funkcji np CzyLiczbaJestWTablicy(liczba, tablica) - WeiXiao 2018-11-16 23:11

Pozostało 580 znaków

2018-11-17 22:32
1

@WeiXiao: albo jeszcze prościej (od czego mamy sety :)):

var random = new Random();
var numbers = new HashSet<int>();
const int limit = 6;

while (numbers.Count < limit) {
    numbers.Add(random.Next(1, 10));
}
edytowany 5x, ostatnio: Desu, 2018-11-17 22:36

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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