我已经有一段时间了。我正在建立一个简单的彩票网站,我正在生成随机票。在我的本地计算机上生成随机数,但是,它们在服务器上是重复的。
我尝试了多种版本,但重复版本是相同的。
我需要为每张票创建一个随机票号,并确保它没有创建。
这是我的第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
答案 0 :(得分:2)
如果可能,您应该使用SecureRandom,而不是随机。它的工作方式相同,但更随机,不需要像Random那样进行初始化:
SecureRandom.random_number * 100.1
如果您使用的是Ruby 1.8.7,则可以尝试使用ActiveSupport :: SecureRandom等效。
此外,如果您要生成彩票,您需要确保您的发电机加密安全。单独生成随机数可能还不够。您可能希望应用其他一些函数来生成这些函数。
请记住,大多数实际彩票不会在购买时生成随机票,但会提前生成大批量,然后将其发送给购买者。这意味着您可以预览票证并确保它们足够随机。
答案 1 :(得分:0)
问题是不使用Ruby的伪随机数生成器,但事实上您始终使用Random.new
创建生成器。正如this answer中所述,您不必多次拨打Random.new
。将结果存储在一个全局对象中,你就可以了。