Olá galera,
preciso de uma mão.
Estou desenvolvendo um gerador aleatório de números, que consiste simplesmente em embaralhar uma sequencias de números informada previamente.
Para isso preencho um ArrayList com a sequencia desejada (exemplo 0 à 99).
Depois para embaralhar eu uso Collections.shuffle(ArrayList), até ai beleza ta funcionado certinho uma linha gerada,
o problema é que preciso de várias linhas, mas tenho que garantir que cada linha fique diferente uma da outra.
Pensei fazer um ArrayList para da linha e dpois fazer uma comparação entre ArrayList (Algo que não pratica não sei como fazer ainda).
A Dúvida é: Será que estou no caminho certo, ou algum iluminado aqui possa me ajudar em uma forma de desenvolver isso.
Obrigado.
Att,
Jaime Vendrame Filho.
Gerar números aleatórios
19 Respostas
Pode nos mostrar um código disso? Não estou conseguindo entender que problema você está tendo.
Só lembrando que em Java existe os métodos Random.nextInt, contains do List/ArrayList, etc.
Olhe o Código que embaralha a sequencia e preenche a JTable com o resultado:
public void Jogar(int inicio, int fim, int coluna, int linha, JTable tabela) {
DefaultTableModel modelo = (DefaultTableModel) tabela.getModel();
modelo.setNumRows(0);
List<Integer> numeros = new ArrayList<Integer>();
for (int i = inicio; i <= fim; i++) { //Sequencia
for (int ii = 0; ii < coluna; ii++) {
numeros.add(i);
}
}
int n = numeros.size(); // Determina o tamanho do ArrayList.
System.out.print("valor de n = " + n + " ");
modelo.setColumnCount(n);
for (int ii = 0; ii < linha; ii++) {
//Embaralhamos os números:
Collections.shuffle(numeros);
Object[] row = new Object[n];
int col = 1;
for (int i = 0; i <= n - 1; i++) {
DecimalFormat df = new DecimalFormat("##00");
tabela.getColumnModel().getColumn(i).setHeaderValue(col);
tabela.getTableHeader().resizeAndRepaint();
tabela.getColumnModel().getColumn(i).setPreferredWidth(25);
row[i] = df.format(numeros.get(i));
System.out.print(df.format(numeros.get(i)) + " ");
col++;
}
modelo.addRow(row);
}
}
Se entendi bem, dá pra fazer o que você quer assim:
- Embaralhar somente uma vez.
- Usar somente 1 for para iterar sobre os números embaralhados
- Remover um número dos números embaralhados e usar ele na tabela.
Vou colocar um exemplo pra ficar bem claro, eu passo os seguintes parâmetros:
sequencia de 0 a 99 e 10 linhas.
o resultado teria q ficar assim
1ª linhas: deve conter todos os números de 0 a 99 de forma embaralhada.
2ª linhas: deve conter todos os números de 0 a 99 de forma embaralhada, mas ordem diferente do que de cima;
3ª linhas: deve conter todos os números de 0 a 99 de forma embaralhada, mas ordem diferente do que de todas as linhas acima.
4ª …
.
.
.
10ª linhas: deve conter todos os números de 0 a 99 de forma embaralhada, mas ordem diferente do que de todas as linhas acima.
sei que isso vai ter limite, se eu informar mtas linhas, não conseguirei esse resultado.
Resumindo, todas linhas devem conter todos os números de forma embaralha e cada linha deve ser diferente uma da outra, como relação a esse embaralhamento.
Obrigado
Então a forma de resolver isso é:
- Embaralhe os números
- Verifique se essa sequência de números já foi adicionada anteriormente.
Para isso, crie mais 2 métodos:
Um método que receba duas Listas de Números, e retorne true caso as duas Listas forem iguais.
Um método que recebe uma Lista de Número, e uma Lista de Lista de Números (uma matriz), e retorne true caso a Lista já exista dentro da matriz.
O segundo método vai acabar usando o primeiro internamente.
Ficaria algo do tipo:
contador = 1
enquanto contador <= 10 {
nova lista de 0 até 99
embaralhar lista
se lista não existe dentro da matriz {
adicionar lista na matriz
contador++
}
}
Ow legal, vou implementar isso, será que tem algum método java de comparação de índice de um array?
Olhei agora, o próprio equals de uma List fala se duas listas são iguais. Anos trabalhando com Java e eu não sabia disso 
Edit: E também há o contains que deve te ajudar à saber se existe uma lista dentro de uma matriz.
mas o equals não compara somente o conteúdo array?
Nossa não imagina que ia dar tanto trabalho.
fiz alguns teste mesmo embaralhando os dados dentro de arraylist os índices não alteram, imaginava se usasse o métodos shuffle num array o dados eram embaralhados junto com seus índices, mas isso não ocorre.
Vou tentar usar um array multidimensional dai posso guardar a posição da linha e da coluna de cada elemento, como todas as linhas contem todos os valores, não possível fazer comparação entre arrays, pois os valores dentro são iguais o que difere é ordem, sendo assim, vou tentar comparar os valores um a um, o qual não sei como rsss.
Acho que você está pensando demais. É bem simples.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Embaralhar {
public static void main(String[] args) {
List<List<Integer>> matriz = new ArrayList<>();
while (matriz.size() < 10) {
List<Integer> listaEmbaralhada = gerarNumerosEmbaralhados();
if (! matriz.contains(listaEmbaralhada)) {
matriz.add(listaEmbaralhada);
}
}
for (List<Integer> lista : matriz) {
System.out.println(lista);
}
}
private static List<Integer> gerarNumerosEmbaralhados() {
List<Integer> list = new ArrayList<>(100);
for (int i = 0; i < 100; i++) {
list.add(i);
}
Collections.shuffle(list);
return list;
}
}
Olá galera,
preciso de uma mão.
Estou desenvolvendo um gerador aleatório de números, que consiste simplesmente em embaralhar uma sequencias de números informada previamente.
Para isso preencho um ArrayList com a sequencia desejada (exemplo 0 à 99).
Depois para embaralhar eu usoCollections.shuffle(ArrayList), até ai beleza ta funcionado certinho uma linha gerada,
o problema é que preciso de várias linhas, mas tenho que garantir que cada linha fique diferente uma da outra.
Pensei fazer um ArrayList para da linha e dpois fazer uma comparação entre ArrayList (Algo que não pratica não sei como fazer ainda).
A Dúvida é: Será que estou no caminho certo, ou algum iluminado aqui possa me ajudar em uma forma de desenvolver isso.
Obrigado.
Att,
Jaime Vendrame Filho.
Dá olhada aqui
Existe uma diferença entre gerar números aleatoriamente e embaralhar coisas. Embaralhar coisas é um dos usos de gerar números aleatoriamente.
Se vc for fazer u mcartão de bingo, por exemplo, é um pouco mais complexo, porque embora seja um sorteio na mesma , é preciso garantir certa distribuição nas linhas para que uma dezena não fique com muitos mais números que a outra.
Dá uma olhada no link, que é o básico e depois vai dai…
usando um pouco de abstração e OO vc resolveria isso com muita facilidade…
Se vc está criando um bingo (por exemplo) crie uma classe chamada ‘Linha’
class Linha {
private Integer coluna_1;
private Integer coluna_2;
private Integer coluna_3;
private Integer coluna_4;
private Integer coluna_5;
@Override
public int hashCode() {
//...
}
@Override
public boolean equals(Object obj) {
//...
}
}
Depois ao invés de usar um Array de inteiros vc usa um Array de Linha…para saber se uma linha já existe no Array basta fazer uma comparação entre os objetos (para isso implemente equals com todas as colunas)
public static void shuffle(List<?> list,
Random rnd)
public Random(long seed)
Siga o concelho do Giulliano esta codificando em Java mas de forma completamente estruturada, crie um objeto para representar a sua estrutura, mas de preferência use arrays ao invés de vários atributos de classe quando estes não passam de elementos de uma lista:
class Linha {
final private int SIZE = 5;
private Integer colunas[];
public Linha() {
colunas = new Integer[SIZE];
}
}
Ve se isso resolve o seu problema cara, falow!
import java.util.ArrayList;
public class Application {
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<Integer>();
for ( int i = 0; i < 100; i++ )
{
int newValue = gerarNovoNumero(list);
list.add( newValue );
}
}
public static boolean contem( ArrayList<Integer> list, int newValue )
{
for ( int i = 0; i < list.size(); i++ )
if ( list.get(i) == newValue )
return true;
return false;
}
public static int gerarNovoNumero(ArrayList<Integer> list)
{
while (true)
{
long mask = 127l;
long newValue = Double.doubleToRawLongBits(Math.random());
long newVal = ( mask & newValue);
final int result;
if ( newVal > 99 )
result = (int)( mask - newVal);
else
result = (int) newVal;
if ( contem(list, result) )
continue;
else
return result;
}
}
}
Ainda estou com problemas, as linhas tem que ser totalmente diferentes uma das outras.
Cada linha contem todos os valores, soh ordem de apresentação dos valores tem que ser diferentes, se uso o equals para comparar, sempre serão iguais, pq todas as linhas contem os mesmos valores, o que preciso fazer é que apresentem cada linha em ordem diferente, não pode ocorrer de um valor ficar na mesma coluna da linha anterior.
Jaime, podeira fazer um método que receba duas listas e retorne false se todos os elementos da lista estiverem em ordem diferente de outro elemento na mesma posição na outra lista?
Você quer criar um jogo de sudoku?
Sim, poderia colocar num for até que todas as linhas fossem comparadas, mas existe algum método para isso, ou tenho que comparar cada valor?
O programa que postei antes já fazia tudo isso que você quer, menos essa parte nova onde os número das colunas não podem se repetir. Vai precisar de um código totalmente diferente.