aleatorizar comandos do script Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

Lazyyy
Posts: 55
Joined: 27 Jan 2020, 21:56

aleatorizar comandos do script

Post by Lazyyy » 14 Apr 2020, 13:25

estou tentando fazer uma função parecida com a de sorteio no meu script, meu script vai apertar os botões F1, F2, F3, F4 e F5. Mas eu não queria que tivesse uma ordem que se repetisse pra sempre e sim uma aleatorização dos botões.

Code: Select all

CoordMode, Pixel, Window
PixelSearch, FoundX, FoundY, 504, 559, 513, 567, 0x050D0B, 5, Fast RGB
If ErrorLevel = 0
{
	Sleep, 1000	;QUERO QUE APENAS OS BOTÕES SEJAM ALEATÓRIOS, OS [docs]Sleep[/docs] PODEM CONTINUAR IGUAIS.
	Send, {F5}
	Sleep, 1000
	Send, {F4}
	Sleep, 1000
	Send, {F3}
	Sleep, 1000
	Send, {F2}
	Sleep, 1000
	Send, {F1}
	Sleep, 1000
	Return
}
Eu imagino que o AHK não tenha um comando pra aleatorização, sendo assim, teria como eu fazer baseado no horário do PC? A hora atual do meu PC é formada por 4 números, os 2 primeiros indicam as horas, os 2 últimos indicam os minutos. Teria como eu usar o último número para aleatorizar as funções? Eu sei que o último número pode ser um número de 0 a 9 (totalizando 10), sendo assim, eu posso colocar uma ordem aleatória para cada número, não precisa ficar 100% aleatório, já que sou eu quem vai decidir a sequência dos Send para cada número, só preciso saber como pegar o último minuto da hora indicada pelo PC, transformar ela num sinal ou num txt, fazer o script ler isso e realizar ações de acordo com o número que estiver lá.

Não sei se ficou claro, mas, eu não preciso que essa aleatorização seja escrita, só preciso do script pegando o último minuto das horas e transformando num sinal ou um txt. O resto eu consigo fazer.

User avatar
Gio
Posts: 1257
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: aleatorizar comandos do script  Topic is solved

Post by Gio » 14 Apr 2020, 15:31

Boa tarde Lazyyy.

Eu imagino que o AHK não tenha um comando pra aleatorização

Tem sim, é o comando Random. Ele seleciona um número aleatório entre um mínimo e um máximo que você mesmo define.

Exemplo: O script abaixo exibe 5 números aleatórios entre 1 e 10.

Code: Select all

Loop 5
{
	Random, NUMERO_SORTEADO, 1, 10 ; Aqui realizamos o sorteio.
	msgbox % NUMERO_SORTEADO ; e aqui exibimos o resultado.
}
Return

:arrow: Se você executar o script várias vezes, verá que a sequência sempre muda.

OBS: como qualquer outro software gerador de número aleatórios, estes números na verdade são pseudo-aleatórios. Mas você pode confiar neles como se fossem aleatórios porque eles possuem as principais propriedades dos números aleatórios (exemplo: qualquer valor possível tem a mesma chance de ser escolhido no sorteio e o processo de escolha é altamente imprevisível).

Não sei se ficou claro, mas, eu não preciso que essa aleatorização seja escrita, só preciso do script pegando o último minuto das horas e transformando num sinal ou um txt. O resto eu consigo fazer.

Bem, creio que a informação acima talvez já mude as coisas, mas isso que você quer também é fácil de fazer. O Autohotkey tem variáveis embutidas que contém os componentes de data e hora atual do computador. Por exemplo, para exibir o segundo atual você usaria a variável embutida A_Sec. E se você só quiser o último dígito, então pode usar a função embutida SubStr() para isolá-lo.

Exemplo: O script abaixo exibe 50x o último dígito do segundo atual do relógio do computador (aperte várias vezes bem rápido o botão da caixa de mensagem para ver o efeito dos segundos passando).

Code: Select all

Loop 50
{
	msgbox % SubStr(A_Sec, 0, 1)
}

Para ver as outras variáveis embutidas com componentes de data e hora disponíveis basta ir nesta página dos arquivos de ajuda.

OBS: Outra opção que talvez seja ainda melhor é pegar o último dígito do tick atual do computador. O tick é a contagem em milisegundos do tempo que o computador permaneceu ligado, então como são milisegundos, usar o seu último dígito vai tornar as coisas com uma aparência até mais aleatória do que o dígito final dos segundos do relógio. A variável embutida A_TickCount contém a contagem atual dos ticks do computador.

OBS2: Apesar de essa ideia de pegar o último segundo (ou até mesmo o último tick do computador) "parecer" um sorteio aleatório a princípio, ela é bastante inferior ao uso do comando Random. A razão disso é simples: o comando Random implementa um algoritmo reconhecidamente bom em termos estatísticos para as principais qualidades de aleatóriedade, e para isso esse algoritmo precisa fazer muitas operações matemáticas sobre a semente (que é o que vem do relógio). A semente pura por si só não tem essa qualidade de aleatóriedade boa. Isso ocorre porque o relógio (ou os ticks) operam em sequência, então você tem facilmente diferenças nas chances de cada número possível ser sorteado, o que fere uma das propriedades principais dos números aleatórios. Exemplo: Se pegarmos o último segundo, o tempo médio entre as chamadas à rotina de sorteio basicamente determinará o resultado dos sorteios, e isso significa que em uma amostra grande de sorteios seria muito fácil ver um peso na quantidade de escolhas de cada número (representado por uma curva em um gráfico que deveria ser basicamente reto). Este peso, no caso do relógio, pode ser entendido como relacionado à média de tempo entre os sorteios. Se a média entre sorteios for de 10 segundos por exemplo, o mesmo número vai se repetir muitas vezes. Se for de 5 segundos, por outro lado, dois números aparecerão muito mais do que os demais. Se a média for qualquer número par de segundos, então os pares ou os ímpares terão muito mais chances ou vice-versa, dependendo do número escolhido na primeira chamada. Por este motivo, algoritmos de geradores pseudo-aleatórios são muito mais complicados de se criar do que parecem a princípio, e é facil para um leigo achar que determinado algoritmo é suficientemente aleatório olhando alguns resultados, mas uma análise estatística em uma amostra de milhares de escolhas pode revelar rapidamente que não é. Não que não seja possível criar um, é claro: se você tiver um conhecimento muito bom em estatística, pode ir aperfeiçoando um algoritmo até que ele passe nos testes de aleatóriedade mínimos para se considerar um bom gerador pseudo-aleatório.

Lazyyy
Posts: 55
Joined: 27 Jan 2020, 21:56

Re: aleatorizar comandos do script

Post by Lazyyy » 14 Apr 2020, 19:36

optei por usar:

Code: Select all

SubStr(A_Sec, 0, 1)
TEMPO := SubStr(A_Sec, 0, 1)
assim eu consigo aleatorizar de acordo com o %TEMPO%

Obrigado, @Gio

SamuelSC

Re: aleatorizar comandos do script

Post by SamuelSC » 09 Jul 2022, 20:22

Aproveitando o post...

Boa noite!

Gostaria de saber como montar o um script de msg onde
o comando randon muda a frase enviada cada aleatoriamente quando faz o loop

desde ja obrigado

s

Post Reply

Return to “Ajuda e Suporte Geral”