2017-08-10 3 views
1
のランダム行

%に基づいてランダムに遭遇しようとしています。MYSQL/PHP - %

私は、MySQLデータベースに "monster_chancespawn" という列ました:1が得た

  • モンスターモンスター2が30%
  • モンスター3が20%を得ました
  • 50%を

私がしたいのは、ランダムなMySQL SELECTを私の "モンスター"データベースでこれらの%に基づいて行うことです。

は、私はすでにそれは通常 "50 30 20" エコー、これによりこの

$monsterspawn=$db->prepare('SELECT * FROM monster'); 
    $monsterspawn->execute(); 
    $monsterspawn->CloseCursor(); 


    foreach ($monsterspawn as $infospawn) 
     { 
     echo . $infospawn["monster_chanceloot"] . ; 
     } 

を得たが、何も本当に便利。 私がしたいことは:

  • それぞれのモンスターに戦利品を得る可能性があります。
  • "もしrandが0から50の間であれば、モンスター1を生み出すかもしれない。もしそれが50から80の間であれば、モンスター3を生み出す。それが80と100の間であれば、モンスター3を生み出す。柔軟、そして私は私が主な問題3.モンスターのため

    $randomspawn = rand(0, 100); 
    if ($randomspawn >= 0 && $randomspawn <= $infospawn["monster_chanceloot"]) 
    { $monstername = "Monster1" } 
    
        elseif ($randomspawn >= $infospawn["monster_chanceloot"] && $randomspawn <= $infospawn["monster_chanceloot"](Monster 2's one)) 
        { $monstername = "Monster2" } 
    

    と同じことが、つまり私を聞かせていないだろうと思い、このような何かを行うことができmonster_chanceloot

を変更したときに変更します利用可能なモンスターの数を変更してください。もう1つの問題は、どのモンスターのモンスターチェンジを得るかわからないことですe foreach。 30個のMYSQL接続をしたくないので、毎回それを使用しないでください。

ありがとうございます!

EDIT

私はMonster1Monster2Monster3ました:ここ"ドイツDrulyk" によって与えられた可能性があります。 私はモンスター1私のデータベースとMonster2 1倍2倍に複製します。

私は今3 Monster1、2 Monster2と1 Monster3を持っています。 モンスター1を選択する確率は50%、モンスター2は33,3、モンスター3は16,6です。

より正確な結果を得るには、100にコピーして1モンスター= 1%にすることができます。モンスターを取得するには、単に実行します。

$query=$db->prepare('SELECT * FROM MONSTERDDB ORDER BY RAND() LIMIT 1'); 
    $query->execute(); 
+0

あなたは100以上のモンスターを作りますか?特定のモンスターがタイプ/層内で同じ正確な機会を持っている場合はどうなりますか?このシナリオを想像してみてください。モンスター1または2でなければならない時間の50%、モンスター3でなければならない時間の30%、モンスター4または5でなければならない時間の20% – MonkeyZeus

+0

私は答えを書いてみます – MonkeyZeus

+0

私の最後のコメントを削除しました、申し訳ありません、私は非常によく理解していませんでした)。まず、5〜20個のモンスターがありますが、大きな数字はありません。あなたの例では、通常、誰も私のデータベースに同じ%を持つことはできませんが、それが当てはまる場合、私はそれを100%に制限するので、実際にはわかりません。つまり、別のモンスターを置くと、他のモンスターの%も等しくなります。 (50〜40%、30〜24 ..) –

答えて

0

を使用すると、ゾーン内の100匹のモンスターを超えることはありませんならば、あなたは、3列のテーブルを必要とします。 zone_id,chancemonster_id

ゾーンごとに、100レコードを挿入し、1から100までのチャンスを設定します。

レコードごとに、それに共通するmonster_idを追加します。ゾーンごとにすべての100件のレコードが例えば

monster_idを持っている必要があり、ZONE1がmonster1と50のレコード、monster2ための30件の記録、およびPHPでmonster3

のための20回の記録を必要とする、あなたはとても

のようなクエリを書くことができます
$sql = "select 
      monster_id 
     from 
      table_name 
     where 
      zone_id = $zoneId and 
      chance = ".rand(1, 100); 

また、私はこれを試していないが、私はネイティブMySQL can achieve the same effectを推測:

$sql = "select 
      monster_id 
     from 
      table_name 
     where 
      zone_id = $zoneId and 
      chance = FLOOR(1 + RAND() * 100)"; 
+0

ありがとう、同じモンスターのコピーが良いアイデアでした!それはより多くの場所を取っていますが、それは今のところうまくいきますし、私はそれが大丈夫だと思うモンスターがたくさんありません。アイデアありがとう! –