Problemao com Matriz

Delphi

27/04/2004

Bom dia pessoal, estou com um problemão em matriz.... segue o que devo fazer..

Uma matriz a[0..19], com conteudos entre -20 a -50 ou de 20 a 50 aleatorios.. ou seja:
a - (1)-21 (2) 48 (3) 25 . . .

o problema é que não estou conseguindo fazer isso...
a outra questao eh a seguinte matriz: B[0..199, 0..19], ou seja, 200x20.. preenchido com 0 e 1 aleatorios... o problema eh que nao consigo gerar os numeros aleatorios da matriz A e nao consigo da matriz B...estou usando o Randomize... Random(x), porem, que no caso da matriz B ele comeca a sair assim 0,0,0,0,0,1,0,0,1,0,0,0... repete d+ o mesmo valor...

Desde já agradeço a todos...
[]s
Fellipe.


Titanius

Titanius

Curtidas 0

Respostas

Zumbi

Zumbi

27/04/2004

use a funcao randomRange(valorinicial, valorFinal);

entao seria..


matrizA[1,1] := randomRange(20,50);

ele ira gerar um numero randomico entre esses dois valores...


GOSTEI 0
Macario

Macario

27/04/2004

Ola programador, bom dia.


so acrescentando, a resposta do nosso colega.

acrescente Randomize, antes de gerar a matriz isto garante que nao havera repetições.


GOSTEI 0
Titanius

Titanius

27/04/2004

Valeu pessoal...funcionou.. o problema agora esta no 0 e 1.... estou usando:
Randomize;
x := Random(1);


o problema eh q estah saindo sempre o 0...

como faco pra gerar este numero?


GOSTEI 0
Nildo

Nildo

27/04/2004

O Random não funciona com apenas dois números. Faz assim para dar um Random em dois numeros:

function Randomiza1e2: Byte;
begin
   Randomize;
   if Random( 9999 ) mod 2 = 0 then
      Result := 1
   else
      Result := 0;
end;


O que eu fiz neste código? Simples, dei u mRandom de um número grande e verifiquei se o mesmo é PAR, assim ele funciona!

Espero telo ajudado!


GOSTEI 0
Marco Salles

Marco Salles

27/04/2004

Desculpe amigos...Mas agora deu um [size=18:dec06b47db][b:dec06b47db]no[/b:dec06b47db][/size:dec06b47db] na minha cabeça...

[b:dec06b47db][color=red:dec06b47db]Primeiro[/color:dec06b47db]:[/b:dec06b47db]
A Instrução funcao [b:dec06b47db]randomRange[/b:dec06b47db](valorinicial, valorFinal); e de qual Delphi :?: :?: :?: Uso Delphi 5.0 e Quando Compila dá[b:dec06b47db] : [Error] Upodeapagarmesmo.pas(55): Undeclared identifier: ´RandomRange´[/b:dec06b47db]

[b:dec06b47db][color=red:dec06b47db]Segundo[/color:dec06b47db]:[/b:dec06b47db]
O Random não funciona com apenas dois números. Faz assim para dar um Random em dois numeros:

[b:dec06b47db]Porque Não [/b:dec06b47db]:?: :?: Eu uso Assim:
MatrisB[i,j]:=Random(2) e Funciona[b:dec06b47db] perfeitamente[/b:dec06b47db] :?: :?: :?: :?:

[b:dec06b47db][color=red:dec06b47db]Terceiro[/color:dec06b47db][/b:dec06b47db]: Para o Nosso Amigo[b:dec06b47db] ´Titanius´[/b:dec06b47db].. Dica:Na definição da matrizB Por se tratar de [b:dec06b47db]apenas [/b:dec06b47db]Zero ou Ums use [b:dec06b47db]Shortint[/b:dec06b47db] ao Inves de [b:dec06b47db]Integer[/b:dec06b47db]...Acredito que se ganha economia na memoria
Var
MatrizB:Array[0..199, 0..19] of [b:dec06b47db]Shortint [/b:dec06b47db]; e não
MatrizB:Array[0..199, 0..19] of [b:dec06b47db]integer [/b:dec06b47db];


GOSTEI 0
Titanius

Titanius

27/04/2004

Caro Marco Sales

A funcao RandomRange esta incluida na unit Math, voce tem q declara-la na uses.. funciona muito bem... quanto a declaracao da variavel, valeu pela dica...
Amigo nildo, vou testar esta funcao aqui, qualquer coisa comunico... valeu pessoal..

[]s
Fellipe H.


GOSTEI 0
Marco Salles

Marco Salles

27/04/2004

Caro amigo Titanius : Obrigado idem pela dica
A funcao RandomRange esta incluida na unit Math, voce tem q declara-la na uses..


Ja quanto a Função Random não funciona com apenas dois números. Faz assim para dar um Random em dois numeros: com todo respeito pelo nosso amigo nildo tenho la minhas dúvisas... Eu Não Vejo problema em fazer assim:
[b:a6283ec42c]MatrisB[i,j]:=Random(2);[/b:a6283ec42c]..Não dá certo :?: :?: :?:


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

27/04/2004

[color=green:d72f57606e]Random(2)[/color:d72f57606e] tá perfeito

Valeu pessoal...funcionou.. o problema agora esta no 0 e 1.... estou usando: Código: Randomize; x := Random(1); o problema eh q estah saindo sempre o 0...


Antes não funcionava pq tavam sendo usado o [color=green:d72f57606e]Random(1)[/color:d72f57606e], dai o equívoco


GOSTEI 0
Marco Salles

Marco Salles

27/04/2004

Marcelo Saviski: Escreveu
Random(2) tá perfeito

Esta é minha opinião também


GOSTEI 0
Titanius

Titanius

27/04/2004

Ola pessoal:
Usando a funcao do nildo deu a o seguinte resultado:
00->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> 38
01->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> -13
02->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> -40
03->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> 112
.
.
.
195->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> 25
196->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> -28
197->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> -119
198->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> 46
199->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> 140

ou seja, nao esta aleatorio os 0 e 1....

e usando o Random(2).. deu exatamente o mesmo resultado...
segue o meu codigo, pra melhor esclaredcimentos:
procedure TForm1.Button1Click(Sender: TObject);
 // Funcao randomica de 0 e 1
 function Randomiza: Byte;
 var
  x: integer;
 begin
  Randomize;
  if Random(9999) mod 2 = 0 then
   Result := 1
  else
   Result := 0;
 end;
var
 Base: array[0..19] of Real;
 Populacao: array[0..199, 0..19] of ShortInt;
 SomaPop: array[0..199] of Real;
 cBase, bBase, i, j, LastMin, LastMax: integer;
 TempSoma, ValLastMin, ValLastMax: Real;
 s: string;
begin
 // Limpa parte Visual
 Memo1.Lines.Clear;
 Memo2.Lines.Clear;
 Memo3.Lines.Clear;
 
 // Preenche a matriz Base
 for i := 0 to 19 do
  begin
   Randomize;
   cBase := Randomiza;
   Randomize;
   bBase := RandomRange(20, 50);

   if cBase <> 1 then
    bBase := bBase * -1;

   Base[i] := bBase;
  end;
 // Exibe a Matriz Base
 for i := 0 to 19 do
  begin
   s := s + FloatToStr(Base[i]) + ´ ´;
  end;
 Memo1.Lines.Add(s);
 
 //-------------------------------------------
 TempSoma := 0;
 for i := 0 to 199 do
  begin
   s := ´´;
   for j := 0 to 19 do
    begin
     // Preenche a Populacao
     Populacao[i, j] := Randomiza;
     s := s + IntToStr(Populacao[i, j]) + ´  ´;
    end;

  end;
 
 // Exibe na tela a matriz Populacao
 ValLastMin := 0;
 ValLastMax := 0;
 for i := 0 to 199 do
  begin
   TempSoma := 0;
   for j := 0 to 19 do
    begin
     TempSoma := TempSoma + (Base[j] * Populacao[i, j]);
    end;

   SomaPop[i] := TempSoma;
   if SomaPop[i] < LastMin then
    begin
     ValLastMin := SomaPop[i];
     LastMin := i;
    end;

   if SomaPop[i] > LastMax then
    begin
     ValLastMax := SomaPop[i];
     LastMax := i;
    end;

   if i < 10 then
    Memo2.Lines.Add(´0´ + IntToStr(i) + ´->  ´ + s + ´    SOMA -> ´ + FloatToStr(SomaPop[i]))
   else
    Memo2.Lines.Add(IntToStr(i) + ´->  ´ + s + ´    SOMA -> ´ + FloatToStr(SomaPop[i]));
  end;
 Memo3.Lines.Add(´Individuo Menos Adaptado:´);
 Memo3.Lines.Add(Memo2.Lines.Strings[LastMin]);
 Memo3.Lines.Add(´---------------------------´);
 Memo3.Lines.Add(´Individuo Mais Adaptado:´);
 Memo3.Lines.Add(Memo2.Lines.Strings[LastMax]);
end;


Desde ja agradeço
Fellipe.


GOSTEI 0
Marcelo Saviski

Marcelo Saviski

27/04/2004

Ola pessoal: Usando a funcao do nildo deu a o seguinte resultado:
00->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> 38
01->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> -13
02->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> -40
03->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> 112
.
.
.
195->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> 25
196->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> -28
197->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> -119
198->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> 46
199->  0  1  1  0  1  1  0  0  1  1  0  0  0  1  0  0  0  0  1  0      SOMA -> 140
ou seja, nao esta aleatorio os 0 e 1.... e usando o Random(2).. deu exatamente o mesmo resultado...


tente com [color=green:7d9311843b]Round(Random)[/color:7d9311843b] ao invés de [color=green:7d9311843b]Randomiza[/color:7d9311843b]


GOSTEI 0
Maxwell_monteiro

Maxwell_monteiro

27/04/2004

O problema é o seguinte! esses funções random são baseadas no relogio do computador logo suponhamos que a menor unidade de tempo que o computador possa medir seja o mili segundo ou seja o random so retornara outro valor diferente depois de decorrido esse mili segundo! só que um computador realiza varias operações em um mili segundo logo os valores retornados pelo random tendem a se repetir ou seguirem uma ordem lógica (a ordem do tempo)! Bem eu te aconselho a procurar em um livro ou até mesmo na internet sobre funções geradoras de numeros aleatórios! Eu já fiz uma vez uma função dessas em um trabalho academico e funcionava bem melhor que essas funções random providas pelas linguagens de programação eu só não te mando pois apagaram meu trabalho do servidor da universidade.


GOSTEI 0
Titanius

Titanius

27/04/2004

Apos muito tempo consegui... !! :D :D :D :D

Muito obrigado a todos...


GOSTEI 0
POSTAR