Jump to content

Randomize/Roll the Dice


FioX

Recommended Posts

Ola,

Um amigo pediu-me ontem para fazer-lhe um programinha em shell que eu concordei contentemente sendo que preciso de praticar, contudo numa parte será necessário utilizar um função que me de um numero aleatório entre 1 e 20.

Eu sei que existe um função para isto contudo não sei qual é nem como usa-la, ja tentamos usar uma vez o Randomiz(), na aula de Programação na minha escola contudo estava a dar problemas(aparentemente estava a dar valores enormes e completamente errados).

Não encontrei nada disto nos manuais la em cima nos topicos em destaque, se alguem pude-se ajudar com esta situação agradecia.

Obrigado,

Fábio Alexandre

Link to comment
Share on other sites

ja tentamos usar uma vez o Randomiz()

achei o raio da função demasiado estranha para perguntar ao google ...

a única coisa parecida que deu foi para VisualBasic !!!! e é Randomize(), faltando o "e" final

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Sistema Operativo ?

Estou usando Linux para programação,mas tenho dual boot por isso se o metodo so dar no windows tambem não é problema

achei o raio da função demasiado estranha para perguntar ao google ...

a única coisa parecida que deu foi para VisualBasic !!!! e é Randomize(), faltando o "e" final

Sim, foi randomize() que exprimentamos, enganei-me.

Edited by FioX
Link to comment
Share on other sites

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
 srand(time(NULL)); /* iniciar o gerador de numero aleatórios */
 printf("numero aleatório : %d\n", (rand() % 20) + 1); /* numero aleatório de 1 a 20 */
 return 0;
}

não é complicado pois não ?

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
 srand(time(NULL)); /* iniciar o gerador de numero aleatórios */
 printf("numero aleatório : %d\n", (rand() % 20) + 1); /* numero aleatório de 1 a 20 */
 return 0;
}

não é complicado pois não ?

Wow,obrigado, Agora até me sinto mal por nao ter consguido algo tão simples. Muito Obrigado, irei tentar agora mesmo ^^.

EDIT: Esta a funcionar lindamente, obrigado ^^

Edited by FioX
Link to comment
Share on other sites

Ola,

Um amigo pediu-me ontem para fazer-lhe um programinha em shell que eu concordei contentemente sendo que preciso de praticar, contudo numa parte será necessário utilizar um função que me de um numero aleatório entre 1 e 20.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
 srand(time(NULL)); /* iniciar o gerador de numero aleatórios */
 printf("numero aleatório : %d\n", (rand() % 20) + 1); /* numero aleatório de 1 a 20 */
 return 0;
}

não é complicado pois não ?

Nao e' bem aleatorio, e' pseudo-aleatorio, se fizeres um ciclo a gerar numeros, iras reparar que muitos dos numeros sao iguais.

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

mesmo se metermos 1000 tambem e' igual, mas tens razao, para o caso pedido e' mais que suficiente 🙂

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Lembro-me de um professor meu me ter falado de uma maneira que não gerava números iguais, sem a utilização de condições, mas não me recordo qual era.

De qualquer modo a utilização de condições para que não repita os números é bastante fácil e simples...

Mas mesmo com condicoes, nao ha garantias que seja aleatorio, porque para ser aleatorio tambem tem que haver colicoes 😄

um algoritmo que ouvi falar bem foi o Mother-of-all e Xorshift

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Em bash podes usar a funcao $RANDOM

http://tldp.org/LDP/abs/html/randomvar.html

Por exemplo:

$ echo $RANDOM
26208
$ echo $RANDOM
21692
$ echo $RANDOM
11847
$ echo $RANDOM
23956
$ 

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Nao e' bem aleatorio, e' pseudo-aleatorio, se fizeres um ciclo a gerar numeros, iras reparar que muitos dos numeros sao iguais.

Isso é pq de 1 a 20 n há muitas possibilidades, n é?

De qq modo, é sempre imprevisível. A hora ao milisegundo nunca é igual e o algoritmo, dado o seed faz com que seja impossível de saber o resultado com antecedência.

Edited by brunoais

"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Link to comment
Share on other sites

Isso é pq de 1 a 20 n há muitas possibilidades, n é?

De qq modo, é sempre imprevisível. A hora ao milisegundo nunca é igual e o algoritmo, dado o seed faz com que seja impossível de saber o resultado com antecedência.

Não tenho a certeza, mas creio que esse time NULL só vai até ao segundo em precisão. E se assim for os diferentes números obtidos no mesmo segundo, baseiam-se apenas no algoritmo e não na aleatoriedade da hora, o que com o conhecimento prévio do mesmo é possível gerar esses números antecipadamente. Normalmente essa coíncidência não é notada porque não se anda a mecher nas horas do relógio.

Experimenta meter uma hora estática, entenda-se (sempre a mesma) e correr o programa várias vezes, a ver qual o resultado que obtens.

Há outras formas de obteres numeros random, fazes um programa que se põe a escutar os pacotes recebidos da interface de rede, por exemplo (podes ir buscar quaisquer dados que saibas que costumam variar num curto estpaço de tempo, limitas o teu interesse aos x bits menos significativos e aí tens um gerador pseudo aleatório sem algoritmo.

Link to comment
Share on other sites

Isso é pq de 1 a 20 n há muitas possibilidades, n é?

Tambem, mas nao so'.

como o @Dr_Lion disse, o time NULL tem um segundo de precisao:

In this example, the random seed is initialized to a value representing the second in which the program is executed (time is defined in the header <ctime>). This way to initialize the seed is generally a good enough option for most randoming needs.

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

This implementation uses a "linear congruential" generator. These generators are very fast, but have the property that the lowermost bits of the number returned may not be particularly random. The number returned is a "good random number" in the sense that:

http://www.thinkage....c/lib/rand.html

Para o problema do user, o srand(time(NULL)) deve ser o suficiente, mas ahco que e' melhor ele perceber que nao e' necessariamente random, e' pseudo-random.

Edited by pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Há outras formas de obteres numeros random, fazes um programa que se põe a escutar os pacotes recebidos da interface de rede, por exemplo (podes ir buscar quaisquer dados que saibas que costumam variar num curto estpaço de tempo, limitas o teu interesse aos x bits menos significativos e aí tens um gerador pseudo aleatório sem algoritmo.

ora aqui está um exemplo muito claro de uma solução exageradamente complexa para um problema simples

usa os números pseudo-aleatórios que não terás problemas.

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.