3
respostas

Alguém poderia me explicar melhor o Random

Eu entendi que ele esta usando uma função random para escolher uma palavra aleatório do arquivo de texto, mas não entendi como esse trecho de código faz isso.

  srand(time(0));
    int random = rand() % words;

    for (int i = 0; i <= random; i++) {
        fscanf(f, "%s", palavrasecreta);

Entendo que words é a primeira linha do arquivo de texto e ele serve para dizer quantas palavras tem no arquivo de texto. Mas não entendi o srand(), o time(0) nem o rand(), alguém poderia, por favor, me explicar melhor como essas funções funcionam e como elas estão ai trabalhando juntas para fazer essa parte do código funcionar?

Colocarei a função word() completa abaixo caso seja necessário para explicação:

void word() {
    FILE* f;

    f = fopen("words.txt", "r");

    int words;
    fscanf(f, "%d", &words);

    srand(time(0));
    int random = rand() % words;

    for (int i = 0; i <= random; i++) {
        fscanf(f, "%s", palavrasecreta);
    }


    fclose(f);
}
3 respostas

Fala Tibério, beleza?

A função rand() é usada para gerar números pseudo-aleatórios a partir de uma semente. Essa semente pode ser definida usando a função srand(). Já a função time() retorna, se não me engano, os segundos desde 01/01/1970. Normalmente essa função é utilizada como semente pois cada vez que o programa for executado o retorno de time() será diferente, já que vai ter passado mais tempo. Dessa forma, ao usar uma semente diferente, os números gerados por rand() serão únicos para cada execução do programa.

Espero ter ajudado!

Computadores digitais são, por definição, determinísticos. Isto significa que dado o conhecimento do estado atual e dos inputs passados é possível determinar qual o próximo estado do sistema. Uma implicação direta disto é que não existe meio algorítmico de gerar números verdadeiramente aleatórios por meio de computadores digitais, o que fazemos é usar algoritmos que consigam gerar sequencias de números pseudo-aleatórios. Podemos quantificar o quão boa essa sequencia é, e estabelecer os parâmetros que atendam às necessidades do problema a ser resolvido. Para saber mais sobre isso, leia teste de Kolmongorov-Smirnov, e teste do qui-quadrado.

Ainda que existam algoritmos razoavelmente bons para essa finalidade, como por exemplo algoritmo Mersenne Twister, todos os algoritmos possuem duas limitações chave: dependem de uma semente inicial, e possuem uma sequencia de tamanho pré-determinado, após a qual reciclam.

A implementação da GLIBC, usada pelo GCC, usa um algoritmo Linear congruential generator (LCG). As duas funções estabelecidas pelo padrão C são srand e rand, a primeira é usada para injetar a semente para o algoritmo gerador, isto é, seta o estado inicial, a segunda obtém o próximo número da sequencia. Sempre que possuir dúvidas sobre funções da biblioteca padrão, busque aqui

No seu problema concreto, temos:

// Recebe o número de palavras no banco
// que está armazenado na primeira linha do
// arquivo
int words;
fscanf(f, "%d", &words);

// Usa o relógio do sistema como semente do gerador aleatório
srand(time(0));

// Pega o próximo número aleatório na sequencia e
// calcula o módulo pelo total de palavras no banco, isto é,
// um índice entre 0 e words - 1
int random = rand() % words;

// varre o banco até chegar ao índice aleatório,
// a cada passada sobrescreve o valor de palavrasecreta
// com a palavra atual
for (int i = 0; i <= random; i++)
    fscanf(f, "%s", palavrasecreta);