Существует rand.Seed()
функция , и есть Rand.Seed()
метод .Ваша цитата основана на документации метода Rand.Seed()
.
Глобальные функции пакета math/rand
работают с глобальным экземпляром rand.Rand
.Если вы проверите исходный код rand.Seed()
:
func Seed(seed int64) { globalRand.Seed(seed) }
Глобальные функции безопасны для одновременного использования, поэтому все другие пакеты могут использовать его (совместно используемым образом).Глобальный экземпляр rand.Rand
предоставляется для удобства, вы можете использовать его «из коробки» без какой-либо подготовки (кроме необходимости его правильного заполнения) и без какой-либо синхронизации.
Экземпляры rand.Rand
небезопасны для одновременного использования, каждая процедура, которой требуется rand.Rand
для детерминированных случайных последовательностей, должна создать ее и заполнить ее соответствующим образом.Или, если rand.Rand
должно быть общим для нескольких групп, требуется явная синхронизация.
Преимущества использования глобального rand.Rand
(через глобальные функции): (1) простота использования (это неявноподелиться со всеми) и (2) синхронизация не требуется.
Плюсы создания и использования пользовательского экземпляра rand.Rand
: (1) это быстрее (не синхронизировано неявно) и (2) вы находитесь под контролемкто имеет к нему доступ, так что вы можете использовать его для повторения псевдослучайных последовательностей (вы не можете сделать это с глобальным экземпляром, поскольку «любой» может использовать его одновременно с вами).
Изменить:
Мы используем одно и то же начальное число в двух разных потоках, поэтому такое использование rand.Seed
считается потоком небезопасным?
Вы вызываете rand.Seed
только один раз, так что на самом деле даже не имеет значения, является ли он потокобезопасным или нет, он не вызывается одновременно.Если rand.Seed()
будет вызываться из нескольких групп одновременно, только тогда будет иметь значение, безопасно ли это для одновременного использования.И как говорилось ранее в моем ответе: «Глобальные функции безопасны для одновременного использования ...»
То, что вы одновременно вызываете из нескольких групп, это rand.Intn()
, но, опять же, этобезопасно сделать это.