首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby:在初始化器中使用`srand`线程安全吗?

Ruby:在初始化器中使用`srand`线程安全吗?
EN

Stack Overflow用户
提问于 2020-10-06 04:16:36
回答 1查看 59关注 0票数 0

下面的代码线程安全吗?我担心srand可能是一个不安全的变量。我有一个rails应用程序,并将使用5-10个线程的Puma。我不想引起问题。

代码语言:javascript
复制
class Test
  def initialize(seed)
    srand seed          # => 1, 222, 222, 111
  end                   # => :initialize

  def letter
    %w[a b c d e f g h i j k l m n o p q r s t u v w x y z aa bb cc dd].sample  # => "g", "u"
  end                                                                           # => :letter
  
  def letter1
    %w[a b c d e f g h i j k l m n o p q r s t u v w x y z aa bb cc dd].sample  # => "g", "u"
  end                                                                           # => :letter1
end                                                                             # => :letter1

Test.new(222).letter   # => "g"
Test.new(222).letter1  # => "g"

Test.new(111).letter   # => "u"
Test.new(111).letter1  # => "u"
EN

回答 1

Stack Overflow用户

发布于 2020-10-06 11:41:09

取决于你所说的“线程安全”是什么意思。但是,默认的随机数生成器是全局的,在线程之间共享;它将取决于线程时间,以查看哪个线程接收哪个随机数。如果您的目的是让所有线程都从一个RNG中获得随机数,那么您的代码就没问题--尽管结果可能是不可重复的,这可能会违背srand的目的。

如果您希望确保每个Test只独立(且可重复地)生成数字,则需要让每个Test都有自己的随机数生成器:

代码语言:javascript
复制
class Test
  def initialize(seed)
    @random = Random.new(seed)
  end

  def letter
    %w[a b c d e f g h i j k l m n o p q r s t u v w x y z aa bb cc dd].sample(random: @random)
  end
end

t1 = Test.new(111)
t2 = Test.new(222)
3.times.map { t1.letter }
# => ["u", "m", "u"]
3.times.map { t2.letter }
# => ["u", "m", "u"]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64215612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档