2017-08-03 73 views
0

我目前正在研究一款需要返回1,2或3的小游戏。Javascript - Math.random的改进

想法是我比较两个数字和更大的胜利。

我正在使用的代码是这样的:

var isMultipleOf, number1, number2, random; 

random = function(number) { 
    return isMultipleOf(Math.floor((Math.random() * number) + 1)); 
}; 

isMultipleOf = function(number) { 
    if (number % 2 === 0) { 
    return 1; 
    } 
    if (number % 3 === 0) { 
    return 2; 
    } else { 
    return 3; 
    } 
}; 

number1 = random((Math.random() * 100) + 1); 
number2 = random((Math.random() * 100) + 1); 

console.log("number 1 is " + number1 + " and number2 is " + number2); 

此代码的工作,但我想如果可能的话,以提高它一下。

在我的比赛中,抽签是可能的,但以我目前的逻辑,它经常发生,我不喜欢它。你能否提出一个更好的方法来改善这一点,使得画一个平局(相同的数字)变得不太可能?

感谢

+4

我投票作为题外话,因为它指的是工作代码关闭这个问题,因此应发布到[代码审查SE网站(https://开头代码审查.stackexchange.com /)。 –

+1

这里有很多关于SO的问题要求更好的方式来做事情,我不明白为什么这是离题的说实话 – Nick

+1

尚未关闭的题外话题的存在并没有使另一个关于主题的话题。 – Quentin

回答

1

你的代码有这么多关系的原因是你的分布真的搞砸了。

isMultipleOf = function(number) { 
 
    if (number % 2 === 0) { 
 
    return 1; 
 
    } 
 
    if (number % 3 === 0) { 
 
    return 2; 
 
    } else { 
 
    return 3; 
 
    } 
 
}; 
 

 
var results = [0,0,0]; 
 
for (var i=1; i<=100; i ++){ 
 
    results[isMultipleOf(i)-1] += 1 
 
} 
 

 
console.log(results)

Chance of 1: 50 
Chance of 2: 17 
Chance of 3: 33 

如果你想要更好的效果,比仅仅使用随机的,它分为3个部分。

getNum = function(number) { 
 
    if (number < .33) { 
 
    return 1; 
 
    } 
 
    if (number < .67) { 
 
    return 2; 
 
    } else { 
 
    return 3; 
 
    } 
 
}; 
 

 
var results = [0,0,0]; 
 
for (var i=1; i<=100; i ++){ 
 
    var rn = Math.random() 
 
    results[getNum(rn)-1] += 1 
 
} 
 

 
console.log(results)

0

首先,你想有一个平局或者也许是更好的只是为了让当你拥有它的另一个随机直到会有获胜的一方或只是让另一个时间,降低了机会画?最简单的方法当然会增加更多的数字,因此统计数据会减少平局的机会。

+0

我试图在代码中添加更多数字,导致背后的想法是随机数越多,得到的抽奖机会就越少。这是可能的,但现在它可以连续发生5-6次,我不太喜欢 – Nick

1

目前选择从1至100的随机数,选择另一个随机数小于或等于第一,然后,如果所述第二数量是2返回1的倍数,倍数为3但不是2返回2,否则返回3.

为什么不选择两个1到3之间的随机数?

var rnd = Math.floor(Math.random() * 3) + 1; // 1 2 or 3, with 1/3 probability 

另一种选择是每个数字从已知池中抽取(如彩票),保证没有关系。

//start with an ordered array 
 
var nums = [1,2,3]; 
 

 
// fisher-yates shuffle 
 
for (var i=nums.length - 1; i > 0; i--) { 
 
    var r = Math.floor(Math.random() * (i + 1)); 
 
    var tmp = nums[r]; 
 
    nums[r] = nums[i]; 
 
    nums[i] = tmp; 
 
} 
 

 
// any two elements can be our drawn numbers 
 
alert("first: " + nums[0] + ", second: " + nums[1]);