Разница между Семенем и Рандом. Семя - PullRequest
0 голосов
/ 31 декабря 2018

Документы Голанга говорят, что

Семя, в отличие от метода Rand.Seed, безопасно для одновременного использования.

На самом деле rand.Seed от math/rand пакет, но что такое семя?Если Seed - другая функция, то ее нет в math/rand, поэтому неясно, откуда эта функция?

update: Я изучаю демонстрационную программу, где в main мы выполняем

rand.Seed(time.Now().UnixNano())
go process(...)
go process(...)    

, где process определяется как

func process(...) {
    time.Sleep(time.Duration(rand.Intn(30)) * time.Second)
    ...
}

Мы используем одно и то же начальное число в двух разных потоках, поэтому такое использование rand.Seed считаетсябыть потоком небезопасным?

1 Ответ

0 голосов
/ 31 декабря 2018

Существует 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(), но, опять же, этобезопасно сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...