英文:
Creating a rand struct
问题
这段代码中有一个TODO注释,意思是要避免使用rand.Float64方法,因为它使用了一个单例锁,可能会导致性能问题。相反,应该实例化一个rand结构体,并使用它来调用Float64()方法。
代码中的standardStrategy函数使用了rand.Float64()方法,返回一个随机数,判断是否小于等于probabilitySend函数的返回值。probabilitySend函数接受一个float64类型的参数ratio,根据一定的计算逻辑返回一个概率值。
总的来说,这段代码的目的是根据一定的概率逻辑来决定是否执行某个策略。而TODO注释则提醒开发者避免使用可能导致性能问题的rand.Float64方法。
英文:
I found the following in this codebase, someone commented on this method with a TODO like so
// TODO avoid using rand.Float64 method. it uses a singleton lock and may cause
// performance issues. Instead, instantiate a rand struct and use that to call
// Float64()
func standardStrategy(l *ledger) bool {
return rand.Float64() <= probabilitySend(l.Accounting.Value())
}
func probabilitySend(ratio float64) float64 {
x := 1 + math.Exp(6-3*ratio)
y := 1 / x
return 1 - y
}
What does this mean?
答案1
得分: 1
我认为这句话的意思是:rand
包中有一个叫做Rand
的结构体,它包含了一些生成随机数的函数,这些函数可能不会锁定全局锁,所以评论的作者可能是指使用这个结构体。例如:
r := rand.New(rand.NewSource(1234))
fmt.Println(r.Float64())
这段代码中使用的函数是该包的全局函数,并且使用了一个全局初始化的Rand
结构体,内部称为globalRand
,它有一个内部的互斥锁。因此,避免使用它可以避免这种锁定。
英文:
I think what it means is this: the rand
package has something called a Rand
struct, which has random generating functions, that probably don't lock a global lock, so probably the writer of the comment meant using this struct. i.e.:
r := rand.New(rand.NewSource(1234))
fmt.Println(r.Float64())
The function used in this code is global to the package and uses a globally initialized Rand
struct, called internally globalRand
, which has an internal mutex. So avoiding using it saves this locking.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论