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

可能であれば、Random ではなく SecureRandom を使用する必要があります。同じように動作しますが、よりランダムであり、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 に答える