0

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

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

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

这是我喜欢的第 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
4

2 回答 2

2

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

SecureRandom.random_number * 100.1

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

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

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

于 2012-09-30T23:37:13.463 回答
0

问题在于Ruby 的伪随机数生成器,而是您一直在使用Random.new. 如本答案所述,您不必多次致电Random.new。将结果存储在一个全局对象中,你会很高兴的。

于 2012-10-01T00:14:57.430 回答