Как эта реализация рандомизации работает в C? - PullRequest
1 голос
/ 17 апреля 2019

Так как я нашел эту конкретную документацию по https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm,I, думал об этой конкретной строке кода srand((unsigned)time(&t));. Когда мне приходилось генерировать некоторые вещи, я использовал srand(time(NULL)), чтобы не генерироватькаждый раз, когда я запускаю эту программу, я спрашиваю себя: есть ли разница между srand((unsigned)time(&t)) и srand(time(NULL))? Потому что мне кажется, что они делают одно и то же. Почему time_tИспользуемая переменная? И почему оператор адреса используется в srand()?

#include <stdio.h>
#include<stdlib.h>
int main(){
int i,n;
time_t t;

n = 5;


srand((unsigned)time(&t)); 


for (i = 0; i < n; i++) {
    printf("%d\n", rand() % 50);
}
return(0);
}

1 Ответ

4 голосов
/ 17 апреля 2019

Да, это даст тот же результат.Но пример плохо написан.

Я бы внимательно прочитал Tutorialspoint.Это сайт, известный плохим кодом C, и многие плохие привычки, которые вы видите в вопросах здесь, в SO, можно отследить на этом сайте.Хорошо, это неподтвержденная информация, но я спросил у пользователя, почему он показал результат malloc, и они ответили, что узнали об этом на Tutorialspoint.На самом деле вы можете увидеть (как минимум) четыре примера в этом коротком фрагменте.

  1. Они приводят результат от вызова к time(), который совершенно не нужен и просто загромождает код.
  2. По какой-то причине они используют переменную t, которая в этом примере совершенно бесполезна.Если вы прочтете документацию по time(), то увидите, что в этом примере достаточно просто передать NULL.
  3. Зачем использовать переменную n?Для этого короткого примера это совершенно нормально с жестко заданным значениемИ когда вы используете переменные, чтобы избежать жестко закодированных значений, вы должны объявить их const и дать им гораздо более описательное имя, чем n.
  4. Пропущено #include<time.h>, что было бы хорошо, если бы они также опускали остальныеиз включенных.

Можно также поспорить о двух других вещах, но некоторые люди с этим не согласятся.

  1. Зачем объявлять i вне цикла for?Объявление его внутри было законным с C99, которому 20 лет.
  2. Зачем заканчивать функцию с return 0?Пропустить это тоже нормально с C99.Возврат в main необходим только в том случае, если вы хотите вернуть что-то, отличное от 0.

И то, и другое выше полезно запомнить, если ваша цель - поддерживать очень старый код C в средах, где вы не 'у него есть компиляторы, которые поддерживают C99.Но насколько это распространено?

Так что, если бы мне пришлось переписать пример в tutorialspoint, я бы написал это так:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
    srand(time(NULL)); 

    for (int i = 0; i < 5; i++) {
        printf("%d\n", rand() % 50);
    }
}

Одна вещь, которую они сделали хорошо, это то, что они использовали int main() вместо int main(int argc, char **argv).Нет смысла использовать вторую подпись, если вы не используете переменные.

...