Jump to content


Photo

Dúvida Com Rand...


  • Faça o login para participar
16 replies to this topic

#1 Fredera

Fredera

    Normal

  • Usuários
  • 78 posts
  • Sexo:Não informado

Posted 01/06/2004, 17:36

Pessoal,
Este belo script abaixo :P, está dando um probleminha e tanto...
É o seguinte: as vezes quando mando rodar o script ele roda perfeitamente, mas as vezes para no meio e nao faz mais nada...
Esse script gera números randômicos num intervalo determinado em $num, a única coisa diferente neste script é que a sequencia nao pode ter nenhum repetido, ou seja num intervalo de 1 a 10 ele nao irá repetir nenhuma vez um determinado nº.
Pra fazer o teste eu coloquei esse FOR de 0 a 10, e tem horas que o script roda blzinha, mas tem horas que ele para no meio e nao acontece mais nada, mas se eu for olhar o processo perl.exe o mesmo etá consumindo 99% do processamento e fica rodando sem parar...
Alguém poderia ver se há algum erro neste script?
Alguém teria um script parecido?


OBS: estou imprimindo o resultado assim:
Ex:
9
7
6
8
5
4
3
1
2
10

1 -> Esse é a variável $a (variável do FOR, só pra ver quantas vezes o sistema rodou...)


Desde já agradeço
[ ]'s
Fredera



#!perl.exe


for ($a=0; $a<10; $a++) {
$num=10;
&Rand_Rep($num);

sub Rand_Rep(){
	$i=1;
	while ($i<=$num){
    $rand_temp=rand($num+1);
    ($n_rand)=split(/\./,$rand_temp);
       if ($n_rand > 0){
          $aux=0;
          for ($x=1;$x<=$i;$x++){
             if ($n_rand == $nrand[$x]){
               $aux=1;
             }
          }
          if ($aux == 0){
              $nrand[$i]=$n_rand;
               $i++;
          }
       }
	}


    foreach $nrand(@nrand) {
       print $nrand."\n";
    }
    print "\n".$a."\n"

}
}

Edição feita por: Fredera, 01/06/2004, 17:39.

"A humanidade está perdendo seus maiores gênios...
Aristóteles já morreu a séculos, Newton bateu as botas faz tempo, Einstein morreu, e eu não tô passando muito bem... " rs

#2 Whitesnake

Whitesnake
  • Visitantes

Posted 01/06/2004, 21:43

Heheh a culpa eh de um mardito incremento q fico faltando!.... :lol:
Veja:

#!perl.exe

for ($a=0; $a<10; $a++) {
$num=10;
&Rand_Rep($num);

sub Rand_Rep(){
$i=1;
while ($i<=$num){
  $rand_temp=rand($num+1);
  ($n_rand)=split(/\./,$rand_temp);
      if ($n_rand > 0){
        $aux=0;
        for ($x=1;$x<=$i;$x++){
            if ($n_rand == $nrand[$x]){
              $aux=1;
$i++;            }
        }
        if ($aux == 0){
            $nrand[$i]=$n_rand;
              $i++;
        }
      }
}

  foreach $nrand(@nrand) {
      print $nrand."\n";
  }
  print "\n".$a."\n"

}
}



#3 Fredera

Fredera

    Normal

  • Usuários
  • 78 posts
  • Sexo:Não informado

Posted 02/06/2004, 08:23

Heheh a culpa eh de um mardito incremento q fico faltando!.... :lol:
Veja:

#!perl.exe

for ($a=0; $a<10; $a++) {
$num=10;
&Rand_Rep($num);

sub Rand_Rep(){
$i=1;
while ($i<=$num){
   $rand_temp=rand($num+1);
   ($n_rand)=split(/\./,$rand_temp);
      if ($n_rand > 0){
         $aux=0;
         for ($x=1;$x<=$i;$x++){
            if ($n_rand == $nrand[$x]){
              $aux=1;
$i++;            }
         }
         if ($aux == 0){
             $nrand[$i]=$n_rand;
              $i++;
         }
      }
}

   foreach $nrand(@nrand) {
      print $nrand."\n";
   }
   print "\n".$a."\n"

}
}

Fala amigo, obrigado, mas nao deu certo...
Agora ele realmente nao para no meio, mas repete os números dentro da sequencia..e isso nao pode acontecer..
ele tem um intervalo de 1 a 10 e não pode acontecer isso:

10
5
6
5
4
3
2
1
9
8

Aí o que acontece? repete o 5 duas vezes e o 7 não aparece...
No meu não deu certo...
Ali naquele $i++ que vc colocou, não poderia estar ali, pois eu só imcremento o $i, quando o número escolhido pelo rand nao for igual a nenhum já existente na tabela, se for igual ele vai repetir o rand, mas sem incrementar o $i.
Alguma outra sugestão
De qualquer forma obrigado...
"A humanidade está perdendo seus maiores gênios...
Aristóteles já morreu a séculos, Newton bateu as botas faz tempo, Einstein morreu, e eu não tô passando muito bem... " rs

#4 stvkoch

stvkoch

    Turista

  • Usuários
  • 53 posts
  • Sexo:Não informado

Posted 02/06/2004, 09:22

eu tenho um script parecido, ou seja que faz o mesmo processo....
o que esta acontecendo é que o script vai ficar em laço até que encontre um numero aleatorio que não esta na "array dos numeros gerados" e isso pode levar no seu caso o tempo que a "sorte(random)" quiser.

tem que deixar ele rodar e terminar.
No seu caso a probabilidade não esta a favor do seu script.
Imagine nos ultimos numeros. Dois ultimos numeros que devem ser gerados, qual a probabilidade de eles sairem repetidos. Diminua a probabilidade.

10 numeros aletorios de 1 a 100 diminui a probabilidade de os ultimos numeros sairem repetidos e o laço terminar mais rapidamente.



Obrigado

Steven Koch

Edição feita por: stvkoch, 02/06/2004, 09:23.

Até mais, espero ter ajudado.


Steven Koch :)
stvkoch@gmail.com

#5 Fredera

Fredera

    Normal

  • Usuários
  • 78 posts
  • Sexo:Não informado

Posted 02/06/2004, 10:48

eu tenho um script parecido, ou seja que faz o mesmo processo....
o que esta acontecendo é que o script vai ficar em laço até que encontre um numero aleatorio que não esta na "array dos numeros gerados" e isso pode levar no seu caso o tempo que a "sorte(random)" quiser.

tem que deixar ele rodar e terminar.
No seu caso a probabilidade não esta a favor do seu script.
Imagine nos ultimos numeros. Dois ultimos numeros que devem ser gerados, qual a probabilidade de eles sairem repetidos. Diminua a probabilidade.

10 numeros aletorios de 1 a 100 diminui a probabilidade de os ultimos numeros sairem repetidos e o laço terminar mais rapidamente.



Obrigado

Steven Koch

Fala...
E vc teria alguma sugestão?
Pq eu deixei rodando e o script nao termina nunca....
"A humanidade está perdendo seus maiores gênios...
Aristóteles já morreu a séculos, Newton bateu as botas faz tempo, Einstein morreu, e eu não tô passando muito bem... " rs

#6 prix

prix

    Duracell: E Duram, Duram, Duram...

  • Usuários
  • 562 posts
  • Sexo:Não informado
  • Interesses:keep walking ...
    jonny walker

Posted 03/06/2004, 03:00

Faz o seguinte coloca um caractere extra, sendo ele uma conta livre de 1 a 10, ao alcancar 10 ele da um last no script para ele sair do while.

pode ser que funcione.

print join'',(reverse  map{/d([a-z])d/}split/W/,'$5x6@314&60f%3i4#moo^1r2#moo^1p2')," ", pack ("B*",'01110000011001010111001001101100')," ", pack ("B*",'011011010110111101101110011010110110010101111001'), "n";
sleep 5;


E-Mails, topicos ou mensagens privadas não serão respondidas a menos que eu considere uma relevancia/necessidade na mesma.

#7 stvkoch

stvkoch

    Turista

  • Usuários
  • 53 posts
  • Sexo:Não informado

Posted 04/06/2004, 10:07

não entendi, postai uma resposta para voce e desapareceu?!

Oque pode ter acontecido!? :unsure:

Mas tudo bem....

Faça o seguinte: Eu tenho a logica aqui, a sintexe é bem facil e ela pode ser bem exuta.

Faça um $array de 1 a 10 [1..10]
O array vai fica assim:

posição
[0][1][2][3][4][5][6][7][8][9]
1 2 3 4 5 6 7 8 9 10
Valor


Crie um for i=0 ate 8
Dentro do for:
pegue o valor do random[9-i]

o valor que foi sorteado eh o da variavel $array[random[9-i]]

exclua o valor ou o campo da array[ random[9-i] ] (não me lembro se tem uma função que exclua um elemento expecifico, mas posso ver se vc não tiver como)
uma alternativa que funciona eh excluir o valor e depois reordenar o array

e pronto deixe o for completar e fora dele processe o ultimo elemento da array.


Entendeu?! Vou fazer um exemplo!

voce tem o array:
[0][1][2][3][4][5][6][7][8][9]
1 2 3 4 5 6 7 8 9 10

o for vai de 0 ate 8
dentro do for no primeiro loop o random[9-i] (i=0) escolheu valor, digamos que 3.
o algoritmo vai imprime ou pega o valor do array[3] que eh 4 e depois o exclui.
Ai o array fica assim:
[0][1][2][3][4][5][6][7][8]
1 2 3 5 6 7 8 9 10

no proximo floop o random pode ir (9-i sendo i=1) 0 ate 8 e escolher a proxima posição a ser pega e excluida.

Ok facil Um abraço a todos Fica com Deus.

Steven koch

Edição feita por: stvkoch, 04/06/2004, 10:27.

Até mais, espero ter ajudado.


Steven Koch :)
stvkoch@gmail.com

#8 Fredera

Fredera

    Normal

  • Usuários
  • 78 posts
  • Sexo:Não informado

Posted 07/06/2004, 10:38

não entendi, postai uma resposta para voce e desapareceu?!

Oque pode ter acontecido!? :unsure:

Mas tudo bem....

Faça o seguinte: Eu tenho a logica aqui, a sintexe é bem facil e ela pode ser bem exuta.

Faça um $array de 1 a 10 [1..10]
O array vai fica assim:

posição
[0][1][2][3][4][5][6][7][8][9]
1  2  3  4  5  6  7  8  9  10
Valor


Crie um for i=0 ate 8
Dentro do for:
pegue o valor do random[9-i]

o valor que foi sorteado eh o da variavel $array[random[9-i]]

exclua o valor ou o campo da array[ random[9-i] ] (não me lembro se tem uma função que exclua um elemento expecifico, mas posso ver se vc não tiver como)
uma alternativa que funciona eh excluir o valor e depois reordenar o array

e pronto deixe o for completar e fora dele processe o ultimo elemento da array.


Entendeu?! Vou fazer um exemplo!

voce tem o array:
[0][1][2][3][4][5][6][7][8][9]
1  2  3  4  5  6  7  8  9  10

o for vai de 0 ate 8
dentro do for no primeiro loop o random[9-i] (i=0) escolheu valor, digamos que 3.
o algoritmo vai imprime ou pega o valor do array[3] que eh 4 e depois o exclui.
Ai o array fica assim:
[0][1][2][3][4][5][6][7][8]
1  2  3  5  6  7  8  9  10

no proximo floop o random pode ir (9-i sendo i=1) 0 ate 8 e escolher a proxima posição a ser pega e excluida.

Ok facil Um abraço a todos Fica com Deus.

Steven koch

Opa...
Cara eu pensei justamente nisso! Mas só tenho uma dúvida de como fazer pra deletar um determinado elemento da array.
Alguém sabe como fazer isso ou tenho que reordenar a array?
Mas de qualquer forma vou fazer isso...quer dizer... tentar...rsrsrs :D

Edição feita por: Fredera, 07/06/2004, 10:38.

"A humanidade está perdendo seus maiores gênios...
Aristóteles já morreu a séculos, Newton bateu as botas faz tempo, Einstein morreu, e eu não tô passando muito bem... " rs

#9 stvkoch

stvkoch

    Turista

  • Usuários
  • 53 posts
  • Sexo:Não informado

Posted 07/06/2004, 13:49

Perl usa variaveis com alocação e tipo dinamico. Uma das maneiras que sei eh usar as função de ordenar uma array, os elementos que estiverem vazios irão para o final e não serão encontrados, a não ser que vc aponte a array para um elemento facil mas ele será null.
Até mais, espero ter ajudado.


Steven Koch :)
stvkoch@gmail.com

#10 Fredera

Fredera

    Normal

  • Usuários
  • 78 posts
  • Sexo:Não informado

Posted 07/06/2004, 14:07

Perl usa variaveis com alocação e tipo dinamico. Uma das maneiras que sei eh usar as função de ordenar uma array, os elementos que estiverem vazios irão para o final e não serão encontrados, a não ser que vc aponte a array para um elemento facil mas ele será null.

Vc tem alguma função pronta de ordenação de arrays?
"A humanidade está perdendo seus maiores gênios...
Aristóteles já morreu a séculos, Newton bateu as botas faz tempo, Einstein morreu, e eu não tô passando muito bem... " rs

#11 stvkoch

stvkoch

    Turista

  • Usuários
  • 53 posts
  • Sexo:Não informado

Posted 07/06/2004, 17:45

BEM FACIL

@numeros = sort{$a<=>$b} @numeros;

ORDENA UM ARRA
Até mais, espero ter ajudado.


Steven Koch :)
stvkoch@gmail.com

#12 Fredera

Fredera

    Normal

  • Usuários
  • 78 posts
  • Sexo:Não informado

Posted 08/06/2004, 16:47

BEM FACIL

@numeros = sort{$a<=>$b} @numeros;

ORDENA UM ARRA

É... pessoal ainda nao consegui fazer....
Acho que estou com algum problema... rsrsrs
Alguém se protifica a fazer um script desses? apenas lembrando os detalhes do primeiro post....
Se alguém tiver afim de ajudar a gradeceria muito...

Outra coisa, uma linguagem como o Perl não tem um rand descente? onde eu passo o intervalo de números que ele retorne o rand.


Atenciosamente
Fredera

Edição feita por: Fredera, 08/06/2004, 17:08.

"A humanidade está perdendo seus maiores gênios...
Aristóteles já morreu a séculos, Newton bateu as botas faz tempo, Einstein morreu, e eu não tô passando muito bem... " rs

#13 stvkoch

stvkoch

    Turista

  • Usuários
  • 53 posts
  • Sexo:Não informado

Posted 08/06/2004, 18:34

aguarde irei postar o codigo... daqui a pouco.


esta aqui o codigo:

@n = 1..10 ;
@newarray = ();#Nova array com os numeros da @n
for($i=0; $i<=9;$i++ ){
$r = int(rand(10-$i));
push(@newarray, $n[$r]);
splice (@n, $r,1);
}
print "@newarray";

um abraço a todos.

Steven

Edição feita por: stvkoch, 08/06/2004, 18:55.

Até mais, espero ter ajudado.


Steven Koch :)
stvkoch@gmail.com

#14 Gabriel

Gabriel

    CGI & PHP até Morre!!!!

  • Usuários
  • 573 posts
  • Sexo:Não informado
  • Localidade:Santo Andre-SP
  • Interesses:http://www.divulgue-me.com

Posted 08/06/2004, 19:33

amigo
o que faz esse splice (@n, $r,1);
abraços
Editado pela equipe Forum Wmo, favor ler as regras.

#15 Fredera

Fredera

    Normal

  • Usuários
  • 78 posts
  • Sexo:Não informado

Posted 09/06/2004, 08:28

aguarde irei postar o codigo... daqui a pouco.


esta aqui o codigo:

@n = 1..10 ;
@newarray = ();#Nova array com os numeros da @n
for($i=0; $i<=9;$i++ ){
$r = int(rand(10-$i));
push(@newarray, $n[$r]);
splice (@n, $r,1);
}
print "@newarray";

um abraço a todos.

Steven

Steven....
Valeu mesmo!!!! vc não imagina como me ajudou...
Muito Obrigado!!!

Gabriel, a função splice faz o seguinte:
vc passa asim splice(@num, 1,3)
o que ele faz:
Pega o vetor na posição 1 e conta 3 depois dele e deleta...Bem interessante....

Obrigado mesmo a todos que ajudaram...
"A humanidade está perdendo seus maiores gênios...
Aristóteles já morreu a séculos, Newton bateu as botas faz tempo, Einstein morreu, e eu não tô passando muito bem... " rs




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq