创建一个 rand 结构体

huangapple go评论78阅读模式
英文:

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.

huangapple
  • 本文由 发表于 2014年10月4日 05:36:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/26187153.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定