Ruby on Rails随机数不起作用

时间:2012-09-30 23:30:08

标签: ruby-on-rails ruby

我已经有一段时间了。我正在建立一个简单的彩票网站,我正在生成随机票。在我的本地计算机上生成随机数,但是,它们在服务器上是重复的。

我尝试了多种版本,但重复版本是相同的。

我需要为每张票创建一个随机票号,并确​​保它没有创建。

这是我的第50个版本:

 a = Account.find(current_account)
    numTics = params[:num_tickets].to_i
    t = a.tickets.where(:item_id => item.id).count
    total = t + numTics
    if total > 5
      left = 5 - t
      flash[:message] = "The total amount of tickets you can purchase per item is five.  You can purchase #{left} more tickets."
      redirect_to buy_tickets_path(item.id)
    else
        i = 1
        taken = []
        random = Random.new
        taken.push(random.rand(100.10000000000000))
        code = 0
        while i <= numTics do
          while(true)
            code = random.rand(100.10000000000000)
            if !taken.include?(code)
              taken.push(code)
              if Ticket.exists?(:ticket_number => code) == false
                  a.tickets.build(
                    :item_id => item.id,
                    :ticket_number => code
                  )
                  a.save
                  break
              end
              code = 0
            end
          end
          i = i + 1
        end
        session['item_name'] = item.name
        price = item.price.to_i * 0.05
        total = price * numTics
        session['amount_due'] = total.to_i
        redirect_to confirmation_path
    end

2 个答案:

答案 0 :(得分:2)

如果可能,您应该使用SecureRandom,而不是随机。它的工作方式相同,但更随机,不需要像Random那样进行初始化:

SecureRandom.random_number * 100.1

如果您使用的是Ruby 1.8.7,则可以尝试使用ActiveSupport :: SecureRandom等效。

此外,如果您要生成彩票,您需要确保您的发电机加密安全。单独生成随机数可能还不够。您可能希望应用其他一些函数来生成这些函数。

请记住,大多数实际彩票不会在购买时生成随机票,但会提前生成大批量,然后将其发送给购买者。这意味着您可以预览票证并确保它们足够随机。

答案 1 :(得分:0)

问题是使用Ruby的伪随机数生成器,但事实上您始终使用Random.new创建生成器。正如this answer中所述,您不必多次拨打Random.new。将结果存储在一个全局对象中,你就可以了。