ライアーゲーム『密輸』プログラムを闘わせよう
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/05/21(月) 23:35:410002デフォルトの名無しさん
2007/05/21(月) 23:42:060003デフォルトの名無しさん
2007/05/22(火) 01:02:100004デフォルトの名無しさん
2007/05/22(火) 10:21:24…と思ったら、LIAR GAME (甲斐谷忍・著) という漫画があるのか。
そんな事とは関係なく、>>1 は削除依頼出して死ぬべきだと思う。
0005デフォルトの名無しさん
2007/05/22(火) 14:17:34どうしたら出来る?
0006デフォルトの名無しさん
2007/05/22(火) 18:04:440007デフォルトの名無しさん
2007/05/22(火) 18:18:28一度に運べるのは1億円まで。
密輸者がお金をトランクに入れて検査室へ
検査官は、お金が入っていると思えばその金額を推測してダウト宣言。
トランクの中に入ってる金額がその金額以内であれば没収。
ただし、お金が入っていないときは、慰謝料として宣言した金額の半分を密輸者に支払う。
お金が入っていないと思えばパス。もしお金が入っていたら、それはそのまま密輸者のものに。。
検査官はダウトして密輸金額を上回ったときにだけお金を得れる。
密輸者は、お金を運んで、それより少ない金額をダウトされたとき・パスされたとき、お金を運ばずダウトされたときにお金を得れる。
密輸者が有利すぎ。
クソゲー。
0008デフォルトの名無しさん
2007/05/22(火) 18:21:08それをA,Bで交互に繰り返すわけだな。
作るとしたら、どんな言語がいいかな。
0009デフォルトの名無しさん
2007/05/22(火) 18:26:31検査官はダウトはパスに比べてリスクが高すぎ。
ダウトをするアルゴリズムかそうでないか、お金を運ぶアルゴリズムかそうではないかという相性だけで勝敗が決まる。
強いアルゴリズムとかはない。
コンピュータ対戦はまったく意味がないゲーム。
0010デフォルトの名無しさん
2007/05/22(火) 18:48:28#include <stdio.h>
#include <stdlib.h>
main(){ //ルールをそのままプログラムにしただけ
int n=100000000, m=100000000; //A,Bの所持金(運んだもの関わらず)
int a, b; //A,Bの運ぶ金 トランクにお金を入れないなら、値は0とする
int A=0,B=0;//A,Bの運び終わった金の合計
int doubt;//ダウトして推測した金額(ダウトと宣言しないなら0にする)
int flg=1; //ゲーム終了で1
while(flg){
a=Aport(n,m);//Aが運ぶ金額を返す関数
doubt=Bdoubt(n,m);//Bがダウトと言うかどうか
printf("Aの運んだ金額:%d\n",a);
if(!doubt){A+=a;printf("Bは華麗にスルー。Aは運ぶことに成功しました。");}
if(doubt){
printf("Bがダウトと宣言しました。");
if(A==0){printf("Aは運んでませんでした。Bの金額から%d引かれます",doubt/2);m-=doubt/2}
else {printf("Aの密輸は失敗しますた。");}}
0011デフォルトの名無しさん
2007/05/22(火) 18:49:48b=Bport(n,m);//Bが運ぶ金額を返す関数
doubt=Adoubt(n,m);//Aがダウトと言うかどうか
printf("Bの運んだ金額:%d\n",b);
if(!doubt){B+=b;printf("Aは華麗にスルー。Bは運ぶことに成功しました。");}
if(doubt){
printf("Aがダウトと宣言しました。");
if(B==0){printf("Bは運んでませんでした。Aの金額から%d引かれます",doubt/2);n-=doubt/2}
else {printf("Bの密輸は失敗しますた。");}}
if(n<0||m<0)flg==0;//A,Bが密輸終了、又は所持金0になる、で終了
}
printf("_______________________________\n密輸できた額:\nA:%d B:%d\n",A,B);
if(A>B)printf("Aのかち");if(A==B)printf("ひきわけ");if(A<B)printf("Bのかち");
return 0;//ゲーム終了
}
int Aport(int n,int m){}//Aの運ぶ額を決める関数
int Bport(int n,int m){}//Bの(ry
int Adoubt(int n,int m){}//AがBにたいしてダウトして推測する額を決める関数
int Bdoubt(int n,int m){}//BがAにたいして(ry
>>7をそのままプログラムにしてみたが、めんどくさいな。どっか間違ってるかも
001210,11
2007/05/22(火) 18:53:43じゃなくて
if(doubt>a)またはif(doubt>b)
だった。ルールちゃんと見てなかったな。
0013Java版 1/7
2007/05/22(火) 20:17:01abstract class Player{
int money = 100000;//所持金
int success = 0;//成功
//名前
String getName(){
return getClass().getSimpleName();
}
//検査官の予測
abstract int guess();
//相手の密輸者がいくら運んでたか
void guessResult(int a){};
//密輸する金額
abstract int port();
//検査官の申告金額
void portResult(int a){};
}
0014Java版 2/7
2007/05/22(火) 20:18:17public class LiarGame {
//※Javaのintは21億までしか扱えないので、1回は1000円までにする
public static final int MAX_PORT = 1000;
public static void game(Player p1, Player p2) {
System.out.printf("%s - %s\n", p1.getName(), p2.getName());
String[] at = {"先行", "後攻"};
for(int i = 0; i < 10; ++i){
Player port = p1;
Player inspector = p2;
for(int j = 0; j < 2; ++j){
int portMoney = port.port();//運ぶ
if(portMoney > port.money) portMoney = port.money;
int guessMoney = inspector.guess();//推測
System.out.printf("*** %2d回戦 %s ***\n", i + 1, at[j]);
System.out.printf("密輸者 %s %d - 検査官 %s %d ***\n",
port.getName(), portMoney, inspector.getName(), guessMoney);
0015Java版 3/7
2007/05/22(火) 20:19:24//運んだ
if(portMoney > guessMoney){
//過小ダウトかパスで成功
port.success += portMoney;
System.out.printf("密輸成功 %d\n", portMoney);
}else{
//失敗
inspector.success += portMoney;
System.out.printf("密輸失敗 %d\n", portMoney);
}
port.money -= portMoney;
}else{
//運んでない
if(guessMoney > 0){
//ダウト失敗
int pena = guessMoney / 2;
inspector.money -= pena;
port.success += pena;
System.out.printf("ダウト失敗 %d\n", pena);
}else{
System.out.printf("何事もなし\n", pena);
}
}
0016Java版 4/7
2007/05/22(火) 20:20:33System.out.printf("%s 成功 %d - 残 %d\n",
p1.getName(), p1.success, p1.money);
System.out.printf("%s 成功 %d - 残 %d\n",
p2.getName(), p2.success, p2.money);
//結果を知らせる
port.portResult(guessMoney);
inspector.guessResult(portMoney);
//入れ替え
Player t = port;
port = inspector;
inspector = t;
}
}
}
}
0017Java版 5/7
2007/05/22(火) 20:21:53int guess() {
return 0;//パス
}
int port() {
return 0;//運ばない
}
}
class 自信家 extends Player{
int guess() {
return LiarGame.MAX_PORT;//ダウト
}
int port() {
return LiarGame.MAX_PORT;//運ぶ
}
}
0018Java版 6/7
2007/05/22(火) 20:26:42int nextGuess = 0;//次の金額
int nextPort = 0;//次の予測
int guess() {
return nextGuess;
}
void guessResult(int a) {
//運んできたらダウトする、運ばなければパス
nextGuess = a == 0 ? 0 : LiarGame.MAX_PORT;
}
int port() {
return nextPort;
}
void portResult(int a) {
//ダウトしてきたら運ばない、パスしてきたら運ぶ
nextPort = a == 0 ? LiarGame.MAX_PORT : 0;
}
}
0019Java版 7/7
2007/05/22(火) 20:30:10結果
自信家 成功 1000 - 残 85000
狡猾者 成功 14000 - 残 100000
LiarGame.game(new 自信家(), new 臆病者());
結果
自信家 成功 10000 - 残 85000
臆病者 成功 5000 - 残 100000
LiarGame.game(new 狡猾者(), new 臆病者());
結果
狡猾者 成功 9000 - 残 91000
臆病者 成功 0 - 残 100000
総合
自信家 成功 11000 - 残 170000
狡猾者 成功 23000 - 残 191000
臆病者 成功 5000 - 残 200000
狡猾者が強いかな。
0020Java版もうひとつ
2007/05/22(火) 20:38:55int guess() {
return Math.random() < .5 ? 0 : LiarGame.MAX_PORT;
}
int port() {
return Math.random() < .5 ? 0 : LiarGame.MAX_PORT;
}
}
結果
狡猾者 成功 5000 - 残 94000
錯乱 成功 7000 - 残 94000
何回かやったけど、勝率は狡猾者より高い感じ。
0021デフォルトの名無しさん
2007/05/22(火) 22:57:121億円運んでればどんな検査官にも勝てるんじゃないかな。
ゲームとして成立してないんじゃない?
0022デフォルトの名無しさん
2007/05/22(火) 23:55:270023デフォルトの名無しさん
2007/05/23(水) 00:05:14ゲーム終了時に密輸できなかった残金は相手のモノになるルールが抜けてるぞ。
0024Java版
2007/05/23(水) 01:13:03System.out.printf("%s:%d - %s:%d\n",
p1.getName(), p1.success + p2.money,
p2.getName(), p2.success + p1.money);
自信家 > 狡猾者 > 臆病者になった
狡猾者:99000 - 自信家:101000
狡猾者:109000 - 臆病者:91000
自信家:110000 - 臆病者:90000
あと、>20の錯乱のportメソッドの数値を.3にしてみた。
錯乱:109000 - 臆病者:91000
錯乱:103000 - 臆病者:97000
錯乱:106000 - 臆病者:94000
錯乱:93000 - 自信家:107000
錯乱:94000 - 自信家:106000
錯乱:98000 - 自信家:102000
錯乱:98000 - 狡猾者:102000
錯乱:101000 - 狡猾者:99000
錯乱:100000 - 狡猾者:100000
0025デフォルトの名無しさん
2007/05/25(金) 21:01:020026デフォルトの名無しさん
2007/05/25(金) 22:09:39AとBはそれぞれ一人ではなくチームであって、このゲームは
団体戦であると同時に個人戦のゲームだってのはかなり重要なんじゃないか?
>>25
個人戦の視点で考えたらダウトせずにパスするのが正解。
0027デフォルトの名無しさん
2007/05/26(土) 19:37:35個人戦的ルールってなに?
0028デフォルトの名無しさん
2007/05/26(土) 19:54:32チームは負けるかもわからんが
0029デフォルトの名無しさん
2007/05/26(土) 19:55:060030・∀・)っ-○◎●
2007/05/26(土) 20:02:060031デフォルトの名無しさん
2007/05/26(土) 21:07:17考えた奴は頭悪いぞ。
0032・∀・)っ-○◎●
2007/05/26(土) 21:09:52いかにして相手を出し抜くかか醍醐味じゃねーの
0033デフォルトの名無しさん
2007/05/26(土) 21:12:580034デフォルトの名無しさん
2007/05/26(土) 23:01:04いや、いかにして都合いいこじつけで物語をすすめるかが醍醐味
0035デフォルトの名無しさん
2007/05/30(水) 01:48:15それだと一人当たりに回ってくる回数が5-6回だから手持ちの1億から2億が相手にとられる。
>>23のルールでね。つかWikipediaの書き方わかりづれー。4巻買ってきたぞ。
結局最後に手に出来る金が3-6億だから確実とはいえないな。
>>13-20も1チーム9人で50回対戦というルールを入れるとわけわからなくなる。
漫画としてはカイジに比べてゆとり世代向けでばからしいし、ゲームのルールも破綻しまくっ
てるけど、団体戦にしてノイズを紛れ込ませやすくしてるから先読みが出来ない。
口座に5000万ない人間を検査官として送り出すのは無意味だし、キャラを馬鹿設定にしておけ
ば最後まで勝負をもつれ込ませるのは簡単だ。
でもちょっとやった感じだと0か1億で出し方を変えるモデルしか成功しなさそうだな。
0036デフォルトの名無しさん
2007/05/30(水) 02:30:05>口座に5000万ない人間を検査官として送り出すのは無意味だし、
あの組織、気前がいいから絶対いくらでも貸してくれるだろw
003735
2007/05/30(水) 10:15:04これって50回ってことは片方が密輸できる回数って25回なん?
だったら最大でも25億しか運べないよな?現金3x9=27億あるのに。
なんか間違ってるんだろうか・・・
プログラム書いてたら、検査官のダウトの確率が密輸人が運ぶ確率の
倍までは結局得になるっていう当たり前の結果だったんだけど、密輸人が
絶対運ばないといけないんだったらダウトしまくりで勝てるじゃん。
0038デフォルトの名無しさん
2007/05/30(水) 12:26:2750回ってことは、50回運べるんじゃね?
003935
2007/05/30(水) 12:57:46そっか。今日帰ったら読んでみるよ。
でも必勝法は検査ターンの残りがn回で口座残高がn/2億あったら全部ダウトだな。
その時の相手の所持金がn/2億以上ならこっちの最大損害はn/2億だけどその場合
相手はそれ以上残して没収だからな。
密輸人も0円にして保証金とっても運べる金が少なくなって没収されるだけだから
駆け引きは無意味で1億運ぶしかない。
結果早い段階でたくさん密輸した方が勝ちなんだが、これも残りn回でn/2以下になら
ないようにしないといけないから2回に1回以上1億運ぶことになる。だったら検査官
は全部ダウトが正解。でも検査官の口座残高がn/2になったらいけないってところで
ようやく駆け引きが出るのに、なんだあの展開?
馬鹿の集まりとしか思えんな。
004035
2007/05/30(水) 20:53:32密輸人:54%の確率で1億運ぶ。が、最初のうちは50%以下に抑えることもあり。
検査官:全てダウト。が、同じく最初のうちはごくたまにパスもあり。
密輸人側と検査官側合わせて11勝したところで検査官は全てダウトのみ。
ダウトのみになったときの口座残高+相手の現金でほぼ決定。
このやり方で負けるのは序盤に負けが込んで口座残高が0になってしまった場合。
必勝法は相手を言いくるめてこっちの口座に金が貯まるまでに少ない金額しか
密輸させないようにすること。
つまらん。
0041デフォルトの名無しさん
2007/05/31(木) 04:01:05「嘘食い」の方は、ちゃんと最初から伏線が張られているというのに。
0042デフォルトの名無しさん
2007/05/31(木) 07:34:08はぁ?
0043デフォルトの名無しさん
2007/05/31(木) 12:16:21今週の話
0044デフォルトの名無しさん
2007/06/01(金) 02:27:410045デフォルトの名無しさん
2007/06/01(金) 02:30:050046デフォルトの名無しさん
2007/06/01(金) 23:49:09ちょっと前からヤンジャン買ってないんだが、どんな仕様変更が入ったん?
0047デフォルトの名無しさん
2007/06/02(土) 01:58:540048デフォルトの名無しさん
2007/06/02(土) 02:21:14818 :名無しんぼ@お腹いっぱい:2007/05/31(木) 06:47:53 ID:J82JmRo10
今回わかった事
・カードは入金も可能
・他人のカードも使用可能
・1億円以上の金額も引出可能
・カードが破損した場合は再発行可能(ただし紛失した場合は再発行不可)
0049デフォルトの名無しさん
2007/06/02(土) 03:48:04でワクテカして待ってたら、どうみてもこじつけとしか思えない必勝法が出てくる予感
0050デフォルトの名無しさん
2007/06/02(土) 11:15:12読んでる側からすれば思いっきり後付扱いされても仕方がないけど、
まぁ、別にそれは話が破綻してるとかの類じゃないからいいんじゃね?
0051デフォルトの名無しさん
2007/06/02(土) 12:48:08てマンガのスレかよ
0052デフォルトの名無しさん
2007/06/02(土) 17:27:56>50
読んでて、自分でトリックを考えるってことができないからつまらん。
「実は同級生でいじめられてたんです」
とか。
0053デフォルトの名無しさん
2007/06/02(土) 18:11:57こんなんプログラムしたっておもしろいわけない
CPU同士でブラックジャックやるようなもん
0054デフォルトの名無しさん
2007/06/02(土) 18:26:08囚人のジレンマの複雑版
0056デフォルトの名無しさん
2007/06/05(火) 18:21:120057デフォルトの名無しさん
2007/06/05(火) 20:53:280058デフォルトの名無しさん
2007/06/05(火) 21:55:04ゲーム理論としてはつまらん部類。
ルールもシンプルじゃないし。
最近囚人のジレンマって聞くとはあ?っていいたくなる。
古い!
0059デフォルトの名無しさん
2007/06/05(火) 23:40:31sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=29437
Mainで名前と戦略を設定。
戦略は>>13氏のをパクった。
仕様変更については考慮してない。
パッケージ
contrabandGame
├strategy
│ ├Strategy.java
│ ├IroiroYarouze.java
│ └MeireiSasero.java
├Game.java
├Main.java
├Player.java
└Team.java
0060デフォルトの名無しさん
2007/06/06(水) 07:11:01ヨコヤが連続して検査官してたり。
お金を運んだあとは検査官しないといけないってこともない。
0061デフォルトの名無しさん
2007/06/07(木) 13:02:01密輸側の収支は、x億残す場合
-15.5 + x/2 億円
になる。ということは一円も運ばないときが最も多く得られる。このときは-2億円。
つまり検査官は全てダウト1億円すれば必ず負けないし、被害を最小限にするには
密輸人は何も運ばないのがベスト。
両方に同じことが言えるから、
密輸側:全て空
検査側:全てダウト
が均衡戦略。ただし検査官の口座が空になってしまうとダウトが出来ないので、
最初のうちで確実に密輸人のスーツケースが空だと分かっている場合にパス
するということも考えられる。
が、その場合少なくともパスの回数が18回ないといけないので、それを見越し
て密輸されるリスクを冒す意味はない。
ゲームのルールとしては破綻しまくってるな。
006261
2007/06/07(木) 18:11:32#!/usr/bin/python
import math
def factorial( N ):
if N <= 1: return 1
return N * factorial( N - 1 )
def combination( N, r ):
return factorial( N ) / factorial( N - r ) / factorial( r )
num_trials = 50 # ゲームの回数
line = "D¥S"
for num_smuggle in range( 0, 28 ):
line += "%5d " % num_smuggle
print line
for num_doubt in xrange( 0, num_trials + 1 ): # ダウトする回数
prob_hit = float( num_doubt ) / num_trials # ある回がダウトである確率
line = "%2d" % num_doubt
for num_smuggle in xrange( 0, 28 ):
expected_detected = 0.0 # ダウトに引っかかる期待値
i = 0 # ダウトに引っかかる回数
while i <= min( num_doubt, num_smuggle ):
expected_detected += i * combination( num_smuggle, i ) ¥
* math.pow( prob_hit, i ) * math.pow( 1.0 - prob_hit, num_smuggle - i )
i += 1
expected_money = expected_detected * -1.0 + ( num_smuggle - expected_detected ) * 1.0 + ( num_doubt - expected_detected ) * 0.5 - ( 27.0 - num_smuggle )
line += " %5.1f" % expected_money
print line
006361
2007/06/07(木) 18:22:11これでN回ダウト、M回密輸で調べると、検査官の最小勝利を最大にするのは40回のダウト。
その場合密輸人は何度運ぼうとも期待値は-7億。
密輸人の方からは10回が最小勝利が最大。
ということで
検査官:40回のダウトをランダムに配置
密輸人:10回ランダムに1億ずつ運ぶ
がmin-max的最適解。この場合勝敗は運のみだが期待値は相手の行動に殆ど依存しない。
相手が最悪の裏目行動にでると予想して最大収益を望むなら密輸人はランダムな27回に
運び、検査官は密輸人が全く運ばないと仮定して何もしない。
0064・∀・)っ-○◎○
2007/06/07(木) 18:48:52006559
2007/06/09(土) 13:09:48MainとTeamとGameを修正。
&ガンガンいこうぜ戦略、お金大事に戦略追加。
sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=29443
第三国口座に1億ない奴が検査官として出てきたり、
ゲーム回数が増えていくにつれランダム側が弱くなっていく…
そのへんも修正しないと。
20ゲームくらいが一番白熱しそう。
0066デフォルトの名無しさん
2007/06/10(日) 14:35:05ダウトするなら1億
だよな
0067デフォルトの名無しさん
2007/06/10(日) 14:35:54結局運任せか
0068デフォルトの名無しさん
2007/06/10(日) 14:42:43昨日ライアーゲームやってたっけな。
あれだろ、チビキノコが、白い頭のやつに、だまされてるやつだろw
006961
2007/06/10(日) 15:21:04でもこの場合でも
検査官:24回ダウト
密輸人:6回運ぶ
というのが均衡戦略で密輸人側が+8億。密輸人は必敗。
どっちかがこの戦略をとったらもう一方は戦略を変えても結果はほぼ同じ。
つまりやってみて勝ったように見えても戦略の善し悪しとは関係なくて運だけ。
必勝法は>>66の言う逆、特に密輸人に1億以下の金を一度でもいいからやらせること。
0071デフォルトの名無しさん
2007/06/19(火) 06:46:520072デフォルトの名無しさん
2007/08/19(日) 13:02:490073デフォルトの名無しさん
2007/08/20(月) 10:06:030074デフォルトの名無しさん
2007/08/20(月) 17:29:360075デフォルトの名無しさん
2007/12/08(土) 00:18:350076デフォルトの名無しさん
2008/01/26(土) 09:28:50密輸→1万
検査(3億以上勝っている場合)→パス
密輸(3億以上勝っている場合)→空
でいいんじゃない?
0077デフォルトの名無しさん
2008/01/26(土) 18:11:25密輸時に金額言われたら次はその金額より少なく運ぶ
検査時は前回運んでいた額を指摘
これでだいたいそいつには勝てるだろ
0078デフォルトの名無しさん
2008/01/26(土) 18:15:54検査時に最初だけ1万円と宣言しあとはパス
密輸時に最初だけ空で次から1億にすれば余裕で勝てるな
0079デフォルトの名無しさん
2008/01/26(土) 20:32:04初回をそれに対応すればいいだけだろ
0080デフォルトの名無しさん
2008/01/26(土) 20:54:53>>78を交互に繰り返すようにするだけ
0081デフォルトの名無しさん
2008/01/27(日) 10:11:45つまり、77にしか勝てないアルゴリズムになるのかな?
0082デフォルトの名無しさん
2008/04/07(月) 16:18:410083デフォルトの名無しさん
2008/06/11(水) 08:20:180084デフォルトの名無しさん
2008/07/24(木) 00:05:12■ このスレッドは過去ログ倉庫に格納されています