• ベストアンサー

割合で表示について

はじめまして。 以下の動物をを指定した割合でランダムに表示しようと思いますが、どのような方法がありますでしょうか。 ゴリラ(割合4) パンダ(割合2) ラッコ(割合3) スズメ(割合1) ウサギ(割合2) rand関数を使って出来そうだったのでやってみたのですが、うまく割合で分ける事が出来ませんでした。 どなたか、何かアドバイスいただけないでしょうか。 よろしくお願いいたします。

  • hana43
  • お礼率49% (105/212)
  • Perl
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

どこらへんが難しいかわかりませんが、こういう感じでしょうか? my @animals = ( {'name' => 'gorilla', 'number' => 4}, {'name' => 'panda', 'number' => 2}, {'name' => 'sea otter', 'number' => 3}, {'name' => 'sparrow', 'number' => 1}, {'name' => 'rabbit', 'number' => 2}, ); sub choose_animal { my $num_all_animals = 0; foreach my $elm (@animals) { $num_all_animals += $elm->{'number'}; } my $choice = rand($num_all_animals); foreach my $elm (@animals) { $choice -= $elm->{'number'}; if ($choice < 0) { return $elm->{'name'}; } } } print &choose_animal()."\n"; 簡単に解説しておくと、 perldoc -f randすれば、randのマニュアルが出てきます。 | rand EXPR | rand Returns a random fractional number greater than or equal to 0 | and less than the value of EXPR. (EXPR should be positive.) つまり、10以下の乱数が欲しかったらrand(10)でいいわけですね。これは少数で出てきますが特に整数にする必要はないのでこのまま使います。ちなみに、下記のプログラムはint(rand(10))などして整数に直してもちゃんと動くはずです。 ある割合で物を選びたい場合、rand(選びたい割合の合計)として、if文で分けるのが普通でしょう。 元の問題を説明のために書き換えて、次の割合で表示させることを考えます。 ゴリラ(2) ラッコ(1) 子犬(3) この場合、if文で普通はこういうプログラムを書きます。 $choice = rand(2 + 1 + 3); if (0 <= $choice && $choice < 2) { print "ゴリラ"; } elsif(2 <= $choice && $choice < 2 + 1) { print "ラッコ"; } elsif(2 + 1 <= $choice && $choice < 2 + 1 + 3) { print "子犬"; } これは、全く同じ動作をさせつつこう書き換えられます。 if (0 <= $choice && $choice < 2) { print "ゴリラ"; } else { $choice -= 2; } if (0 <= $choice && $choice < 1) { print "ラッコ"; } else { $choice -= 1; } if (0 <= $choice && $choice < 3) { print "子犬"; } else { $choice -= 3; } そのままforeachで書き換えると、 foreach my $elm (@animals) { if ($choice < $elm->{'ratio'}) { print $elm->{'name'}; break; } $choice -= 3; } のように書けます。 randの引数もforeachを使って計算し、breakさせる代わりにreturnさせると上のようなプログラムになります。

hana43
質問者

お礼

質問内容があいまいな中、丁寧に回答いただきありがとうございます。 私の知識では、ゴリラ、ラッコ、子犬の例での説明が分かりやすく、大変参考になりました。 ありがとうございました。

その他の回答 (2)

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.3

割合ですからゴリラからウサギまでで10割りになるようにしてください。 そこで次のようにしてはいかがでしょう。 A2セルから下方にゴリラからA6にウサギまでを入力します。 B2セルからB6セルにはその割合を入力します。1割なら1と、全体で10になるようにします。 C1セルには全体で取り扱う動物の個数を入力します。20匹の動物ということなら20と入力します。 C2セルには次の式を入力して下方にドラッグコピーします。 =IF(A2="","",SUM(B$2:B2)*C$1/10) A10セルには次の式を入力して下方にドラッグコピーします。 =IF(ROW(A1)>C$6,"",RAND()) 乱数が表示されます。 B10セルには次の式を入力して下方にドラッグコピーします。 =IF(A10="","",IFERROR(INDEX(A$2:A$6,IF(COUNTIF(C$2:C$6,RANK(A10,A$10:INDIRECT("A"&MATCH(10^10,A:A))))=1,MATCH(RANK(A10,A$10:INDIRECT("A"&MATCH(10^10,A:A))),C$2:C$6,0),MATCH(RANK(A10,A$10:INDIRECT("A"&MATCH(10^10,A:A))),C$2:C$6,1)+1)),A$2)) これでB10セルから下方にはC1セルに設定された動物の全体の個数がB2セルから下方に並べられた割合に基づいた動物の名前がランダムに表示されます。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

既にNo.1で書かれていますが、別解です。 @animals=('ゴリラ', 'ゴリラ', 'ゴリラ', 'ゴリラ', 'パンダ', 'パンダ', 'ラッコ', 'ラッコ', 'ラッコ', 'スズメ', 'ウサギ', 'ウサギ'); print $animals[int(rand($#animals+1))]; 普段Perlを使わないので文法的に怪しいかもしれませんが

関連するQ&A

  • 人参嫌いなウサギはいるの?

    本当に素朴な疑問なのですが、 お解りになる方いらっしゃれば、教えて頂きたいです。 ●ウサギは、人参 ●パンダは、笹の葉 ●ラッコは、貝 などなど、動物によって、「これを食べる」とされている 食物ってありますが、ウサギでも人参を食べないといったように 稀に好き嫌いをすることってあるのでしょうか? また、絶対的に好むとすれば、その動物に対して 好物と特定されるものをなぜ好き嫌いをしないのでしょう? 宜しくお願い致します。

  • セルの指定をランダムしたい

    Sheet2のA列に[名前]が10行入っています。 それをSheet1のA1にランダムに表示したいのですが A1の1の部分をRAND関数で1~10を指定する方法がわかりません。 =Sheet2!A[RAND()*10+1]  A1~A10がランダムに選ばれるイメージです。 どの用に書いてやればうまくいくのでしょうか? よろしくおねがいします。

  • EXCELで乱数表示に条件を加えたいのですが...

    1から10までの数をA1~A10のセルに重複なしでランダムに表示する際に, 今まで,RAND関数,RANK関数,RANDBETWEEN関数,sortedlistクラスなどを使っていました. そこに,A1には2はダメ!,A2には4はダメ! … というように,各セルで表示される数を制限 した下でランダム表示したいのですが,どのようにすればいいか思いつきません... 良い考えがあれば,是非教えて下さい.お願いします.

  • 関数 ランダム 指定した条件

    よろしくお願いします! =INT((10-1+1)*Rand()+1) のようにすれば、1~10までのランダムな数字が入力できる訳ですが、例えば2,3,5,7のように指定した数字からランダムで入力(選択)させることを関数を使って行う事は出来るのでしょうか? マクロを使わないと無理でしょうか? 全く別件ですが、Rand()の()内に何か入力して使う機会というのはあるのでしょうか?

  • 出現率を上げる

    セルA1に1~5までの整数をランダムに表示できるように関数で入力してあります。 =ROUNDDOWN(RAND()*(5-1)+1,0) この値をたとえば、5が表示される回数を2倍に増やす方法を教えていただきたいのです。 よろしくお願いします。

  • array_rand関数

    現在、ランダム関数を使用して、配列にある値の中から ランダムにいくつかの配列を抜き出す処理を行っています。 $rand_keys = array_rand($id,2); for($k=0;$k<count($rand_keys);$k++){  $rand_id[$i][$k]=$id[$rand_keys[$k]]; } ただし、この関数では一つだけ取り出したい場合には使えません。 何かよい方法はありませんか??

    • ベストアンサー
    • PHP
  • エクセルのIF関数を教えてください

    もし、A1のセルがキリンなら1000、ウサギなら3000、パンダなら5000、何も入っていなければ空欄をA2のセルに表示しなさいという関数を教えてください。 IF(A1="キリン","1000",IF(A1="ウサギ","3000",A1="パンダ","5000","")) でやったらエラーが出てしまいました。お手上げです。 よろしくお願いします。

  • ブラウザに文字が表示されません。

    はじめまして。 質問があります。 以下のコードを見てください。 ---------------------------------------------------------------- <html> <head> <script type="text/javascript"> <!-- function rand() { window.document.getElementById("i").innerHTML = Math.random(); } //--> </script> </head> <!-- <body onLoad="rand()"> --> <body> <form name="myform"> <input type="submit" name="submit" onClick="rand()"><br> </form> <div id="i"></div> </body> </html> ---------------------------------------------------------------- あらかじめonLoadイベントでrand()関数を呼び出しておくと、後から 送信ボタンを押下すると、 ブラウザに乱数が表示されるのですが、onLoadイベントを使用せずに 送信ボタンを押下するとブラウザに 乱数が表示されません。これは一体なぜなのでしょうか? 例えば、レイアウトが一度確定したら、そのレイアウトに後から 文字などを表示させることができないなどというような原因 なのでしょうか?よくわかりません。ご教授お願いします。

  • Rand関数について

    Rand関数について コンピューターの素人です。以下のカッコの中の理解で間違いないかどうか、教えてください。 「Rand関数は乱数を発生させる関数である。Rand関数は最小値と最大値を指定して、その範囲で整数の乱数を発生させることができる。」

  • ランダム関数で任意の桁数のランダム数字を作りたい

    エクセル2000ユーザーです。ランダム関数を使い、重複を許さない5桁のランダム数字を1000個作りたいと思っています。randbetween関数を使おうと思ったのですが、2000では使えないのか、NAMEといったエラー表示がでます。5桁の中は同じ数字がでてきても構いません。例:11295、43634、70676・・・etc。 が、1000個の中では同じ数字が重複しないようにしたいです。 =RIGHT(RAND(),5) のように考えたのですが、他にいい方法はありますでしょうか? マクロやVBAは苦手なので、できれば関数でいいやり方があれば教えてください。