我知道这不是提出这个问题的正确位置,但也许是一个聪明人遇到并有解决方案.
我正在尝试编写一个电脑游戏,我需要一个算法来解决这个问题:
游戏在2名玩家之间进行.每边都有1.000美元.有三个"盒子",每个玩家记下他要放入这些盒子里的钱.然后比较这些数量.谁在一个盒子里放了更多的钱,得分为1分(如果每个人得到半分).获得更多积分的人赢得了对手1.000美元.游戏示例:
玩家A:[500,500,0]玩家B:[333,333,334]
玩家A获胜是因为他赢得了方框A和方框B(但输掉了方框C).
问题:放钱的最佳策略是什么?
我有更多问题要问(算法相关,而不是数学相关)但我需要首先知道这个问题的答案.
更新(1):经过一些研究后,我了解到这些类型的问题/游戏被称为Colonel Blotto Games.我尽了最大努力,发现了很少(高技术性)的文件.简而言之,我所遇到的问题(如上所述)被称为简单的Blotto游戏(只有三个具有对称资源的战场).困难的是具有10个以上具有非对称资源的战场.我读过的所有文件都说简单的Blotto游戏很容易解决.问题是,他们都没有真正说出那个"简单"的解决方案.
更新(2):我写了一个小动作文件来演示Tom Sirgedas提到的论文中的策略.你可以在megaswf测试它.说明:单击三角形内的一个点.红色区域代表胜诉案例.蓝色区域代表丢失的情况,微小的白色线代表抽奖.
大多数教程/文章/书籍在介绍函数式编程时都会讨论副作用.拿这个Python代码:
def isPrime(n):
k = 2
while k < n:
if n % k == 0:
return False
k += 1
return True
Run Code Online (Sandbox Code Playgroud)
文中说上面的功能有局部副作用,我不明白.我看到变量"k"正在发生变化,我不明白它有什么不好.
有人可以给出一个明显的不良副作用的例子,以及如何通过函数式编程来避免它?
Scala中以下Java代码的等价物是什么:
import java.util.Random;
public class Bool {
private boolean door;
Random random = new Random();
Bool() {
this.door = random.nextBoolean();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当创建新的Bool对象时,门变量将自动获得随机布尔值.
我无法弄清楚我应该采用哪种设计模式.说我有这样的课:
class Person
String role;
public void takeRole(String role) {
this.role = role;
}
public void do() {
switch(role)
case a:
do this and that;
this.role = b;
case b:
do this and that;
case c:
do this and that;
this.role=a;
....
Run Code Online (Sandbox Code Playgroud)
简而言之,一个人有角色,而do()方法取决于他的角色是什么.在某些情况下,他可能不得不转换角色.我认为这个do()应该是抽象的(更多是因为将来可能会定义其他角色)---但是如何?应该有角色类吗?
任何帮助将不胜感激.
编辑:
感谢您节省时间,人们.我想补充一点.我确实认为(至少作为一个想法)许多建议的解决方案.以下是我的困难:如果我将Person类(例如PersonTypeA,personTypeB等)子类化,并将每个特定角色分配给适当的人员类型,那么在切换角色时我会遇到困难(例如,工程师成为会计师! ---很奇怪,至少可以这么说.
另一方面,如果我为每个角色创建类; 然后(1)一个角色感觉不像是一个对象,因为(至少在我的情况下)角色没有属性而只有方法.因此,role_A_1与role_A_2没有什么不同.但对于每个人,我都必须创建一个新的角色对象 - 即使他们都有相同的角色.
我不确定我是否清楚自己,我不确定我的观点是否有意义.
为了使递归过程更加明显,给出了这个例子:
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n - 1) + fib(n - 2)
def trace(f):
f.indent = 0
def g(x):
print('| ' * f.indent + '|--', f.__name__, x)
f.indent += 1
value = f(x)
print('| ' * f.indent + '|--', 'return', repr(value))
f.indent -= 1
return value
return g
fib = trace(fib)
print(fib(4))
Run Code Online (Sandbox Code Playgroud)
我能理解跟踪功能的"内容",但我不明白"如何".特别:
1)为什么我们有f.indent而不是简单的缩进= 0(好吧,我看到那不起作用,但我不明白为什么).
2)我不明白怎么做
print('| ' * f.indent + '|--', 'return', repr(value))
Run Code Online (Sandbox Code Playgroud)
在找到值之前不会执行.
有人会善意地解释整件事吗?
这是我的测试代码(Python 3.2)
import random
def singleMatch():
a = random.randint(1, 5050)
b = random.randint(1, 5050-a)
c = 5050-a-b
h = [a, b, c]
print(h)
computer = [841, 842, 3367]
score = 0
for i, j in zip(computer, h):
if i > j:
score = score + 1
if score == 2:
return 1
else:
return 0
def match(n):
matchScore = 0
for i in range(n):
s = singleMatch()
matchScore = matchScore + s
return matchScore
x = match(10000)
print(x)
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,我有时会收到此错误:
Traceback …Run Code Online (Sandbox Code Playgroud)