Generowanie tablicy składającej się z 0 i 1 z ustaloną maksymalną liczbą jedynek

0

ogólnie chcę wygenerować tablicę składającą się z 0 i 1. Przy czym 1-ek nie może być więcej niż założę na początku działania programu. Wykorzystałem standardowy obiekt Random, ale problem jest z nim taki, że przy dużej liczbie wierszy i kolumn 1-ki nie rozkładają się po całej tablicy tylko, z reguły, w pierwszych dwóch wierszach. jak sobie z tym poradzić?
kod programu:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;


public class GraLosowa
{

	public static void main(String[] args) throws NumberFormatException, IOException
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int liczbaWierszy, liczbaKolumn;
		Random losowaLiczba = new Random();
		int a;
		int iloscPolWygrywajacych, k = 0;
		
		System.out.print("Wprowadz wielkość planszy do gry: \r\nliczba wierszy: ");
		liczbaWierszy = Integer.parseInt(br.readLine());
		System.out.println(liczbaWierszy);
		
		System.out.print("liczba kolumn: ");
		liczbaKolumn = Integer.parseInt(br.readLine());
		System.out.println(liczbaKolumn);
		
		System.out.print("Wprowadź liczbę pól wygrywających: ");
		iloscPolWygrywajacych = Integer.parseInt(br.readLine());
		
		int[][] plansza = new int[liczbaWierszy][liczbaKolumn];
		
		for(int i = 0; i < liczbaWierszy; i++)
		{
			for (int j = 0; j < liczbaKolumn; j++)
			{
				a = losowaLiczba.nextInt(2);
				//System.out.println(a);
				if (a < 0.5)
					plansza[i][j] = 0;
				else
					{
										k++;
					if (k > iloscPolWygrywajacych)
						plansza[i][j] = 0;
					else plansza[i][j] = 1;
					}
					
			}
		}
		
		for(int i = 0; i < liczbaWierszy; i++)
		{
			for (int j = 0; j < liczbaKolumn; j++)
			{
				System.out.print(plansza[i][j] + "  ");
			}
			
			System.out.println("");
		}		
	}

}

przykładowy wynik na wyjściu:

0  0  0  0  1  1  1  1  1  0  
1  1  0  0  0  0  0  1  0  1  
1  0  0  0  0  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  0

oczekuje bardziej czegos takiego:

0  0  0  0  1  0  1  0  0  0  
1  1  0  0  0  0  0  1  0  1  
1  0  0  0  0  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  0  
1  0  0  1  0  0  1  0  0  0  
0  0  0  0  0  0  0  0  0  1  
1  0  0  1  0  0  0  0  0  0  
0  0  0  0  0  0  0  0  0  1  
0  1  0  0  0  1  0  0  0  0  
0  0  0  0  1  0  0  0  0  0

dodanie znacznika <code> dla wyjścia - fp

1

Ja zrobiłem kiedyś testy i 60% liczb losowanych od 0 do 255 to były zera :(
Więc wpadłem na pomysł
że castowałem jak zero randomuje jeszcze raz jak jeden to możesz dać 0 a jak wypadnie 2 to dajesz jeden, powinno to rozwiązać problem, choć nie jest to efektywne dla gigantycznych liczb losowań.

0

ok. dzięki. wpadłem na rozwiazanie, może nie najlepsze ale jest. losuje liczby z większego zakresu, i mocno zawężam prawdopodobieństwo na 1.

for(int i = 0; i < liczbaWierszy; i++)
		{
			for (int j = 0; j < liczbaKolumn; j++)
			{
				a = losowaLiczba.nextInt(5);
				System.out.println(a);
				if (a < 4)
					plansza[i][j] = 0;
				else
					{
						k++;
						if (k > iloscPolWygrywajacych)
						plansza[i][j] = 0;
						else plansza[i][j] = 1;
					}
					
			} 
2
for(int y=0;y<liczbaWierszy;++y) for(int x=0;x<liczbaKolumn;++x) plansza[y][x]=0;
for(int k=0;k<iloscPolWygrywajacych;++k)
  {
   int y=losowaLiczba.nextInt(liczbaWierszy),x=losowaLiczba.nextInt(liczbaKolumn);
   if(plansza[y][x]==0) plansza[y][x]=1;
   else --k;
  }

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