ショッピングモール  Operating Systems / Microsoft ( Windows 98 )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5126

結果から過程を生成するには
投稿者---chu-(2005/12/21 14:19:08)


自動販売機の当たり抽選画面を見ていてふと気になったので質問します。
その抽選画面はいくつか種類があって以下のようなものです。
・ルーレット(減速していき、大吉で止まれば当たり)
・徒競走(加減速しながら前進し、5人中1位になれば当たり)
・etc.

ひとまず徒競走を組む場合を考えてみます。
・5人それぞれを乱数値ずつ前進させ、先頭がゴールしたときにチェック
簡単に思いつくのはこれだったのですが、
これでは、当たるのか外れるのか、先頭がゴールするまで何秒かかるのか、
それらのことが組んだ本人もゴールするまでわからず、すっきりしません。

やはりプログラマ的には、抽選の偏りを補正したり、
抽選画面に割り当てられた時間に適切に納めたり、と制御したいところです。

そうすると、結果がまずあり、そこから過程を生成することになるのですが、
いい方法が考えつきません。
最後のあたりでBダッシュしてしまう等、どうにも不自然です。

なるべく不自然にならないように工夫するしかないのでしょうか。
もし定石等ありましたらお教えください。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:結果から過程を生成するには 5127 たいちう 2005/12/21 15:05:08
<子記事> Re:結果から過程を生成するには 5132 chu- 2005/12/26 12:59:20


No.5127

Re:結果から過程を生成するには
投稿者---たいちう(2005/12/21 15:05:08)


> これでは、当たるのか外れるのか、先頭がゴールするまで何秒かかるのか、
> それらのことが組んだ本人もゴールするまでわからず、すっきりしません。

この辺は好みの問題だと思いますが、乱数を直接使うと不自然に見えるので、
自然に見えるように演出する、というのはあるでしょう。

(A)
徒競走の例でしたら、ゴールする時間から標準的なペースを決めておいて、
これより大きく遅れたら減速する確率を減らしたりすることで、目標に近い
時間でゴールできます。

(B)
また、シナリオをプログラム時に決めておいて、Aさんに勝たせたい場合には
Aさんに1位の役を割り振ることもできます。10秒で終了するシナリオを
10個用意しておけば、10×5!のレースができます。


(B)の方法が簡単だし一般的だと思いますが、このような仕事をしたことは
ないので、確信はもてません。

(A)の方法を丁寧に実装すれば、必ず10秒で終了させることもできますし、
ゴールまでのシミュレーションをしてから表示を開始することで、
先に勝者が判ります。


# 思いつきで書いてみただけなので、実情や定石をご存知の方、お願いします。


この投稿にコメントする

削除パスワード

No.5130

Re:結果から過程を生成するには
投稿者---円零(2005/12/21 18:01:04)


まずは自分の書いたコードを貼って欲しかったですね。

試しに作ってみましたがこんなんどうでしょう。
まず勝者を決めて、所定時間に進む距離を決めて(一位の人だけゴールに着くように)、
その距離を時間単位ごとにランダムに振り分ける、という発想です。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define MEMBER 5
#define STEPS 6
#define DISTANCE 20
#define MAXDELAY 8

int main(void){
    int i, j, winner;
    int total[MEMBER];
    int prog[MEMBER][STEPS] = {0};
    int crrnt[MEMBER] = {0};
    char ast[DISTANCE];

    memset(ast, '*', DISTANCE);
    srand((unsigned)time(NULL));
    winner = rand() % MEMBER;
    for(i = 0; i < MEMBER; i++){
        total[i] = DISTANCE - (i == winner? 0: rand() % MAXDELAY + 1);
        for(j = 0; j < total[i]; j++)
            prog[i][rand() % STEPS]++;
    }
    for(i = 0; i < STEPS; i++){
        for(j = 0; j < MEMBER; j++){
            crrnt[j] += prog[j][i]; 
            printf("%d: %.*s%*s", j, crrnt[j], ast, DISTANCE - crrnt[j] + 2, "|\n");
        }
        scanf("%*[^\n]");
        scanf("%*c");
    }
    printf("winner: %d", winner);
    return 0;
}



この投稿にコメントする

削除パスワード

No.5132

Re:結果から過程を生成するには
投稿者---chu-(2005/12/26 12:59:20)


考えが凝り固まっていましたが、方法はいろいろありそうですね。
参考になりました、ありがとうございます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity