電子書籍の厳選無料作品が豊富!

問題:1等が出るまでくじ引きをつづけるプログラムを作成せよ.出目の確率は下記の通りとする.
1等: 0.75%
2等: 2.25%
3等: 18.00%
4等: 79.00%

上記のプログラムの作成方法がわかる方、教えていただきたいです。よろしくお願いします。

A 回答 (3件)

No1です。

出目の確率をきちんと指定の値通りにすることが、必須条件であれば、No2の方が提示された方法が正解になるかとおもいます。その場合はNo1は無視してください。
    • good
    • 1
この回答へのお礼

わざわざありがとうございます!
どちらも参考にさせていただきます!

お礼日時:2021/06/07 22:54

$a=array_merge(


array_fill(1,3,1),
array_fill(1,9,2),
array_fill(1,72,3),
array_fill(1,316,4)
);
shuffle($a);
while(($n=array_shift($a))){
print $n." ";
if($n==1) break;
}
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます!
やってみます!

お礼日時:2021/06/07 22:53

以下のようにしてください。


<?php
$rank1 = 0;
$rank2 = 0;
$rank3 = 0;
$rank4 = 0;
$ctr = 0;
srand(time());
while(TRUE){
$n = rand(1,10000);
$ctr++;
switch($n){
case $n <= 75:
$rank1++;
break;
case $n <= 300:
$rank2++;
break;
case $n <= 2100:
$rank3++;
break;
default:
$rank4++;
break;
}
if($ctr==100000) break;
if ($rank1 > 0) break;
}
printf("rank1=%d rank2=%d rank3=%d rank4=%d ctr=%d\n",$rank1,$rank2,$rank3,$rank4,$ctr);
printf("rank1 %4.2f%%\n",100*$rank1/$ctr);
printf("rank2 %4.2f%%\n",100*$rank2/$ctr);
printf("rank3 %4.2f%%\n",100*$rank3/$ctr);
printf("rank4 %4.2f%%\n",100*$rank4/$ctr);
?>

実行結果
rank1=1 rank2=0 rank3=17 rank4=57 ctr=75
rank1 1.33%
rank2 0.00%
rank3 22.67%
rank4 76.00%

次に
if ($rank1 > 0) break;の行をコメントアウトして実行してください。
以下のような実行結果になります。
rank1=776 rank2=2244 rank3=17980 rank4=79000 ctr=100000
rank1 0.78%
rank2 2.24%
rank3 17.98%
rank4 79.00%
1等が0.75%、2等が2.25%、3等が18.00%、4等が79.0%付近の確率で実行されているのが判ります。
不明点は補足してください。
    • good
    • 1
この回答へのお礼

回答ありがとうございます!
自分が考えていたプログラムと全く違っていたのでびっくりです。(ここまで思い付きませんでした)
ありがとうございます!作成してみます!

お礼日時:2021/06/07 13:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!