Size: a a a

2021 June 23

ЯК

Ярослав Коробейников... in Go-go!
А минусы есть какие-то у использования глобального ?
источник

AB

Andrey Burov in Go-go!
шутка если что...
источник

AB

Andrey Burov in Go-go!
чуть медленне из-за mutex
источник

ЯК

Ярослав Коробейников... in Go-go!
Ну конечно не очень хорошо, но что поделать.... Но я имею ввиду... Я даже не знаю как адекватно спросить, типа распределение рандома получается будет равномерным по всему проекту, а не для конкретных методов допустим?.....
источник

AB

Andrey Burov in Go-go!
если взять все вызовы intn - будет равномерно
источник

ЛА

Локоть Анатолий... in Go-go!
за что купил, за то продаю.
В комменте сказано, что рандом crypto/rand более рандомный, что стоит больше ресурсов.
В то время, как math/rand предсказуем, зная о том, как сетится Seed, что может быть причин уязвимости, видимо, потому gosec это и проверяет.
источник

AB

Andrey Burov in Go-go!
да, если будет одинаковый seed, то и последовательность будет одинаковая
см. в wiki /dev/random и /dev/urandom
источник

ЯК

Ярослав Коробейников... in Go-go!
Допустим раньше было что объект рандома создавался в начале функции
func (s *Some) SomeMethod()  {
 r := rand.New(rand.NewSource(time.Now().UnixNano()))
 
 someFlag := r.Intn(100) == 0
 if someFlag {
   ....
 }
 .....
}

То бишь в таком случае someFlag был бы тру в условно 1 раз на 100 вызовов????
При использовании глобального ранда это уже не шибко гарантируется?
источник

AB

Andrey Burov in Go-go!
ну и так не гарантируется, ну при бесконечном кол-ве вызовов - да - будет один на 100
источник

AB

Andrey Burov in Go-go!
при общем rand результат будет тот же
источник

AB

Andrey Burov in Go-go!
это уже про математику и теорию вероятностей
источник

ЯК

Ярослав Коробейников... in Go-go!
Тут кстати интересный момент... Хотел только щас написать что утром пытался это воспроизвести но очень странно не получалось, код был такой
func main() {
 s := rand.NewSource(1)
 r1 := rand.New(s)
 r2 := rand.New(s)

 fmt.Println(r1.Intn(100))
 fmt.Println(r2.Intn(100))
}

При этом числа генерились разные, а сейчас я по быстрому сделал
func main() {
 //s := rand.NewSource(1)
 r1 := rand.New(rand.NewSource(1))
 r2 := rand.New(rand.NewSource(1))

 fmt.Println(r1.Intn(100))
 fmt.Println(r2.Intn(100))
}

И они начали генериться одинаковые ;D
источник

AB

Andrey Burov in Go-go!
ну очевидно почему
источник

ЯК

Ярослав Коробейников... in Go-go!
А для тупых?)
источник

AB

Andrey Burov in Go-go!
источник случайных чисел это source, а не rand
источник

AB

Andrey Burov in Go-go!
в первом варианте у вас один источник, и дергаете его по очереди...
а во втором два разных (но по сути одинаковые т.к. seed одинаковый)
источник

ЯК

Ярослав Коробейников... in Go-go!
Во 👍, а то было честно говоря странно)
источник

ЯК

Ярослав Коробейников... in Go-go!
Ну мне тут не нужен криптографически надёжный рандом, я тут не ключи шифрования им генерирую)
источник

ЯК

Ярослав Коробейников... in Go-go!
func (s *Some) SomeMethod()  {
 // Wrapper under global random
 s.randomizer.Seed(10)

 // Но ничто не гарантирует что в определённый момент
 // другая горутина своим сидом не испортит мой Seed(10)
 // и где-то дальше внутри этого метода будет вызов s.randomizer.Int с моим сидом 10?
 someFlag := r.Intn(100) == 0
 if someFlag {
   ....
 }
 .....
 s.randomizer.Seed(1)
}
Так я так понимаю тоже не получится для определённой функции держать свой сид?)
источник

AB

Andrey Burov in Go-go!
у вас архитектура фу какая-то
источник