我目前正在从事计算机科学课程,这在技术上适合初学者,但我觉得他们给我的所有作业都比我能处理的更复杂。
这项任务要求我进行抛硬币模拟。三个人玩游戏,每个人都有特定的要求赢得:
我应该做的是进行300次实验。每次我都应该确定三人赢了多少次以及多少次。我真的卡住了。我几乎没有任何代码,但我对代码应该是什么有一个非常基本的想法,但我不能把它放到Java语言中。
对于我的作业,我需要显示导致一个人获胜的二进制序列。
我的想法:
修改 我试图改变每个人所说的内容,现在确实看起来更好,谢谢!但它仍然没有做它应该做的事情,我想知道为什么。我运行代码,我只得到一个输出;不是我希望它运行的300次。此外,最后的计数器不会保存关于谁赢了的信息,他们每次都会重置。有时候两个人会赢,但那是不可能的。任何人都可以澄清这个吗?
修改 这是代码的另一个更新。我相信它确实运行了300次!现在的问题是输出。有时会说; 1伯尼赢了,而你显然需要至少2个结果让伯尼获胜。此外,它说1 Penny赢了,而那也不可能。我在if语句中搞砸了什么吗?
import java.util.Random;
public class Assignment3e
{
public static void main(String[] args)
{
int counter1 = 0;
int counter2 = 0;
int counter3 = 0;
Random coin = new Random();
for(int i = 0; i <= 300; i++){
int headCount = 0;
int tailsCount = 0;
for(int coinToss = 0; coinToss <= 3; coinToss++){
int random = (int) (Math.random() * 6) + 1;
String binary = Integer.toBinaryString(random);
boolean result = coin.nextBoolean();
if(result){
headCount++;
}
else{
tailsCount++;
}
if(headCount == 2 && binary.length() % 2 ==0){
//Amy wins
counter1 = counter1 + 1;
System.out.println(binary + " Amy wins.");
}
else if(tailsCount == 2 && binary.length() % 2 == 0){
//Penny wins
counter2 = counter2 + 1;
System.out.println(binary + " Penny wins.");
}
else if(headCount == 2 || tailsCount == 2 && binary.length() % 2 != 0){
//Bernie wins
counter3 = counter3 + 1;
System.out.println(binary + " Bernie wins.");
}
}
}
System.out.println("Amy wins " + counter1 + " times.");
System.out.println("Penny wins " + counter2 + " times.");
System.out.println("Bernie wins " + counter3 + " times.");
}
}
答案 0 :(得分:4)
你几乎做对了。
此部分不再相关,因为OP在评论中添加了一项要求。
你的第二个
for
循环只需要运行最多3次,因为至少有2个头或2个尾巴,而不是10个。编辑:你可以使用最多2次投掷:如果有1个头部和1个尾部,则获胜者是第3个玩家(
Bernie
)现在,在每次迭代中,你可以绘制一个0到1之间的随机十进制数,并假设它超过
0.5
它是一个头,所以你增加headCount
,否则你增加{{ 1}}。然后你可以对计数器(以及投掷次数)进行测试。比使用二进制字符串更容易。
编辑:
回答你的评论:
查看您初始化tailCount
和headCount
的位置。请记住,一旦获胜,必须重置这些计数器。
由于这是家庭作业,我不会发布代码:)
修改强> OP jsut添加了一条评论,说明他需要打印导致每场比赛结果的序列。
我们假设二进制tailCount
是头部,而1
是尾部。如果0
获胜,您需要掷硬币3次才能知道序列。因此,以二进制字符串转换的整数值Bernie
只需要由3位(1位= 1折)组成。
random
只能取0到7之间的值。
当您一次性获得所有值时,您不再需要random
for循环。您需要做的就是检查二进制字符串的开头是否匹配任何获胜模式(2个头为coinToss
,2个尾为11
,否则伯尼获胜)
答案 1 :(得分:0)
所以我在这里注意到了一些事情:
您不会在任何地方更新headCount
或tailCount
。这应该是你用来跟踪硬币翻转的数量。
当你在后续循环中重新使用它们时,一定要将它们重新归零。
如果只需要一个简单的nextBoolean
就足够了,那么你的结果范围非常广泛。您可以在循环中使用它:
boolean result = coin.nextBoolean(); // this renames dice to coin
if(result) {
headCount++;
} else {
tailCount++;
}
投掷总数始终当前迭代的当前值(加1)。因此,在您的情况下,您只需将sum
替换为j
,但您希望为其指定更有意义的名称,例如coinTosses
。
答案 2 :(得分:0)
如果您为硬币nextBoolean()使用Random()对象,为什么不用int random = (int) (Math.random() * 6) + 1;
替换int random = coin.nextInt([range here])
?