Losowe rozmieszczenie znaku w tablicy dwuwymiarowej

0

jak zrobić żeby program losował rozmieszczenie np. trzech jedynek na tablicy [5][5]. reszta to powinny być zera. po wyswietleniu tablicy powinno to wygladac np. tak:

00000
01000
00101
00000

za każdym uruchomieniem programu romieszczenie jedynek musi byc inne.

4

umiesz wylosowac liczbe z zakresu 0 - 24?
Umiesz losowac bez powtorzen?
BTW co juz napisales?

0
KamilAdam napisał(a):

umiesz wylosowac liczbe z zakresu 0 - 24?
Umiesz losowac bez powtorzen?
BTW co juz napisales?

for (int i = 1; i <= size; i++) {
    for (int j = 1; j <= size; j++) {
        random = rand()%100;
        switch (size) {
        case 5:
            if (atom_number ==3) break;
            else if (random < 13) {
                tab[i][j].atom = true;
                atom_number++;
                break;
            }
        case 8:
            if (atom_number == 6) break;
            else if (random < 11) {
                tab[i][j].atom = true;
                atom_number++;
                break;
            }
        case 10:
            if (atom_number == 8) break;
            else if (random < 9) {
                tab[i][j].atom = true;
                atom_number++;
                break;
            }
        }
    }
}
3

Po kolei. Bo jakąś dziwną logikę masz. Do czego służy zmienna atom_number? Dobra, chyba już wiem. Zamiast losować współrzędne, to przelatujesz przez całą tablicę i losujesz, czy nie wstawić i jak wstawisz odpowiednią liczbę, to przerywasz.

Tylko że to jest problematyczne (co jeśli przelecisz przez całą tablicę i nic nie wstawisz? Co jeśli ułożenie tych znaków będzie nierównomierne? W końcu pola, po których iterujesz najpierw, mają większą szansę na uzyskanie znaku).

No i co chodzi z tym switch/case i magic numbers?
https://en.wikipedia.org/wiki/Magic_number_(programming)

jak zrobić żeby program losował rozmieszczenie np. trzech jedynek na tablicy [5][5]. reszta to powinny być zera. po wyswietleniu tablicy powinno to wygladac np. tak:

Naiwne podejście to wylosowanie dwóch liczb dla dwóch indeksów tablicy i wstawienie tam jedynki. I powtórzenie tego 3 razy.

Tylko tym sposobem może się zdarzyć, że wylosujesz dwa razy takie same liczby, więc potrzebujesz obsłużyć jakoś duplikaty.

3

Jeśli mają być zawsze 3 to wylosuj sobie trzy indeksy bez powtórzeń, sposób opisałem kiedyś tutaj. W skrócie: dla małych tablic (np. 25 elementów) po prostu wymieszaj indeksy i weź 3 pierwsze. Dla dużych losuj tak długo aż znajdziesz odpowiednio dużo różnych indeksów.

0
kq napisał(a):

Jeśli mają być zawsze 3 to wylosuj sobie trzy indeksy bez powtórzeń, sposób opisałem kiedyś [tutaj][1].

W przypadku, gdy wejściowy zbiór liczb do losowania jest duży, procedura losowania n elementów wygląda następująco:

1. Wylosuj wartość i dodaj ją do zbioru unikalnych wartości już wylosowanych.
2. Jeśli zbiór już wylosowanych elementów ma mniej niż n elementów – idź do punktu 1.

W opisie powinno byc "niewydajna procedura losowania". Jakos tak bedzie lepiej (jesli mozna modyfikowac dane wejsciowe):

  1. wylosuj wartosc od 0 do n - 1
  2. zamien wylosowana wartosc z wartoscia ostatnia
  3. n--
  4. wroc do punktu 1.
0

Najlepiej to pogadać z CzatGPT:

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

int main() {
    const int size = 5;
    const int n = 3;
    const int totalElements = size * size;
    int randomNums[size][size] = {0}; 
    srand(static_cast<unsigned>(time(0)));

    for (int i = 0; i < n; ++i) {
        int index = rand() % totalElements;

        if (randomNums[index / size][index % size] != 1) {
            randomNums[index / size][index % size] = 1;
        } else {
            --i;  
        }
    }

    for (int i = 0; i < size; ++i) {
        for (int j = 0; j < size; ++j) {
            std::cout << randomNums[i][j] << ' ';
        }
        std::cout << '\n';
    }

    return 0;
}

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