如何在两个值之间生成一个随机数,优先选择接近极限的数字

时间:2018-02-04 22:28:24

标签: javascript

我正在实施一个基本上扮演Battle Ships游戏的AI系统。 此AI的一部分包括将船舶放置在板上。这应该是一个随机过程,但是统计数据显示,如果您将船只靠近棋盘边缘,则更有可能赢得比赛。

这样的事情: enter image description here

所以,说船可以在X(0到9之间)和Y(0到9之间)的任何位置我想实现一个算法,它可以生成0到9之间的随机整数,返回概率更高数字接近0或接近9(4和5的数字不太可能返回)。这将是一个javascript算法,但任何使用伪代码的直觉都会受到赞赏。

有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

因此,假设您有一些样本和合理的抽样函数

// an equal distribution
const equalDistribution = 
  [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

// fair sampling function
sample (equalDistribution) // equal probability of 0 - 9

只需调整样本以包含您希望更频繁显示的更多数字 - 下面,09的概率(3/14)与之前(1/10)相比增加< / p>

// 0 and 9 are more likely
const inequalDistribution =
  [ 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9 ]

// same fair sampling function
sample (inequalDistribution) // = 0 and 9 more likely

这使您可以完全控制您想要的结果分布。当然,你现在的工作是创建一个功能,它需要equalDistribution并根据一些输入创建inequalDistribution。这是你编写程序的地方,如果你遇到问题,请分享并寻求帮助。

答案 1 :(得分:0)

基本上你所做的就是总结所有细胞的概率,然后选择一个随机数&amp;乘以这个总和。

现在循环你的概率矩阵并从随机数总和中减去,直到小于等于0.这就是你想要的那个。

下面是一个简单的例子,它是一个3 x 3矩阵,其中单元格4(中间一个)的概率是其余部分的一半,因此单元格4的选择应该是其余部分的一半。

PS。单元4如0-8,...不是1-9,因为数组是基于零的。

&#13;
&#13;
const squaresProb = [
  2, 2, 2,
  2, 1, 2,
  2, 2, 2
];

const maxProb = squaresProb.reduce((a, v) => a +v);

function pickRandomCell() {
  let r = Math.random() * maxProb;
  for (let c = 0; c < squaresProb.length; c ++) {
    r -= squaresProb[c];    
    if (r <= 0) return c;
  }
  return squaresProb.length -1;
}

const cellCounts = [0,0,0, 0,0,0, 0,0,0];

//test..  Pick 100,000 cells, 
//Cell 4 should be the smallest.

for (let l = 0; l < 100000; l ++) {
  cellCounts[pickRandomCell()] ++;
}

console.log(cellCounts);
&#13;
&#13;
&#13;