Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我在哪里失去了随机性?_Javascript - Fatal编程技术网

Javascript 我在哪里失去了随机性?

Javascript 我在哪里失去了随机性?,javascript,Javascript,所以我在做一个石头,布,剪刀的游戏。我想得到math.random()来给我一个随机结果,并与用户选择的结果进行比较 它主要起作用。我甚至认为它在一段时间内完全有效,但我在某个时候失去了随机性 为了尝试它,我输入了一个固定的“用户”选项,并使用setInterval(myfunction,20)运行了几百次代码。他们总是不平衡的胜利,并且总是有相同的结果: 如果我在playerPick=1的情况下运行它,计算机总是会赢 如果我在playerPick=2或3的情况下运行它,用户总是赢 有人能看到我

所以我在做一个石头,布,剪刀的游戏。我想得到math.random()来给我一个随机结果,并与用户选择的结果进行比较

它主要起作用。我甚至认为它在一段时间内完全有效,但我在某个时候失去了随机性

为了尝试它,我输入了一个固定的“用户”选项,并使用setInterval(myfunction,20)运行了几百次代码。他们总是不平衡的胜利,并且总是有相同的结果:

如果我在playerPick=1的情况下运行它,计算机总是会赢

如果我在playerPick=2或3的情况下运行它,用户总是赢

有人能看到我在哪里胡闹吗

//Global variable and constants.

const ROCK = 1;
const PAPER = 2;
const SCISSORS = 3;

//This is the game.

function whoWins(){
    const playerPick = 2; //for debugging, it can be 1, 2, or 3.
    const computer = computerPick();
    if (playerPick == computer){
        return draw();
    } else if (playerPick == 1 && computer == 2){
        return lose();
    } else if (playerPick == 2 && computer == 3){
        return lose();
    } else if (playerPick == 3 && computer == 1){
        return lose();
    } else {
        return win();
    }
}

//These are the inputs for the game.

rockButton.addEventListener('click', () => {
    playerPick = ROCK;
    return whoWins()});
paperButton.addEventListener('click', () => {
    playerPick = PAPER;
    return whoWins()});
scissorsButton.addEventListener('click', () => {
    playerPick = SCISSORS;
    return whoWins()});

function computerPick() {
    let computerChoice = '';
    const getRandom = Math.random;
    if (getRandom() >= 2/3) {
        computerChoice = ROCK;
    } else if (getRandom() >= 1/3){
        computerChoice = PAPER;
    } else {
        computerChoice = SCISSORS;
    }
    return computerChoice;
}

我对所有这些都很陌生,但这仍然不是随机的。

这应该是一个简单的修复,正如您需要调用Math.random一次的注释中所提到的,否则概率会发生偏差

我认为一张纸的概率是0.66*0.66=~44%,使用原始代码,剪刀的概率是0.66*0.33=~22%。新函数应该解决这个问题

const-ROCK=1;
常数纸=2;
常数剪刀=3;
//原始计算机拾取功能
函数computerPickOriginal(){
让计算机选择=“”;
const getRandom=Math.random;
如果(getRandom()>=2/3){
计算机选择=岩石;
}else if(getRandom()>=1/3){
计算机选择=纸张;
}否则{
计算机选择=剪刀;
}
返回计算机选择;
}
//固定电脑拾取功能。
函数computerPick(){
让计算机选择=“”;
const choice=Math.random();
如果(选项>=2/3){
计算机选择=岩石;
}否则如果(选项>=1/3){
计算机选择=纸张;
}否则{
计算机选择=剪刀;
}
返回计算机选择;
}
功能选择(选择){
如果(choice==ROCK)返回“ROCK”;
如果(选项==纸张)返回“纸张”;
如果(选项==剪刀)返回“剪刀”;
}
//检查每个版本代码的分发情况。
日志(“检查分发(10000次挑选)…”;
让原始_计数={};
让计数={};
for(设i=0;i<10000;i++){
设k=computerPick();
计数[k]=(计数[k]| 0)+1;
设k2=computerPickOriginal();
原始_计数[k2]=(原始_计数[k2]| 0)+1;
}
console.log('Computer Pick Distribution(original):',Object.entries(original_counts).map([key,value])=>`${decodeChoice(key)}:${value}`);

console.log('Computer Pick Distribution(fixed):',Object.entries(counts).map([key,value])=>`${decodeChoice(key)}:${value}`)为了将来的参考,您可能会发现使用数组更容易

const getRandomChoice=()=>{
const options=[‘石头’、‘布’、‘剪刀’];
const randomIndex=Math.floor(Math.random()*options.length);
常量选择=选项[随机索引];
回报选择;
}
常量计数={};
for(设i=0;i<10000;i++){
设p=getRandomChoice();
计数[p]=(计数[p]| 0)+1;
}

控制台日志(计数)
const getRandom=Math.random上使用Math.random方法
你必须实际调用这个方法(
Math.random()
),省去这个偏执,你只是在使用一个方法引用,而不是实际生成一个随机数。一个bug。。。你调用<代码> GeTrand()/<代码>每一个计算机拾取-但是,这并不能解释结果总是考虑的部分乘以<代码> GeTrand()/代码> 100,并处理整数值(例如,66,>33)。分数和计算机可能很棘手。@Joe-huh?1/3和2/3不是tricky@LukasBach他们稍后将使用
getRandom()
调用该函数,但可能不需要在“如果其他”语句中多次调用它。谢谢您的回答,修复了它。我不确定代码的第二部分做了什么(从const getRandom开始…)。只是为了检查分发情况吗?我还注意到您在顶部使用math.random,在底部使用math.random()(带和不带制动器)。有什么区别吗?哦,是的,对不起@Billedale,我可能只需要清理一下代码:)。。是,第二部分检查原始分发版本和固定版本。我们可以看到你的原始版本给了纸大约44%的机会和剪刀大约22%(0.66*0.33)。这是一个非常微妙的错误!谢谢,我会记住的。我只有一个问题,从getRandomChoice的理解来看,《剪刀》是如何获得与其他两部一样多的点击率的?为什么在使用Math.floor时不将其截断,因为它将舍入到最接近的整数?例如:当应用Math.floor时,randomIndex=0.8*3=2.4=2?@Billedale-由于生成的数字是0、1和2,所以它得到的命中率相同。数组是从索引0开始访问的,因此按这种方式考虑,它们被命中的可能性是相等的
Math.random
生成一个介于0和1之间的数字(包括0,但不包括1)。以下面的例子为例| 0.1*3=>0.3=>0 | | 0.35*3=>1.05=>1 | | 0.999999*3=>2.99997=>2 |啊!让我困惑的是一个0开头。非常感谢,我以后肯定会用这个。