我正在实现一个基本上玩战舰游戏的AI系统。人工智能的一部分就是把船放到板上。这应该是一个随机的过程,但是统计数据显示,如果你把你的船放在靠近棋盘边缘的地方,你更有可能赢得游戏。
如下所示:

所以,假设船可以在任何位置X(在0到9之间)和Y(在0到9之间),我想实现一个算法,可以生成一个介于0和9之间的随机整数,返回更接近0或更接近9的数字的概率(4和5是不太可能返回的数字)。这将是一个javascript算法,但是任何使用伪代码的直觉都是可以理解的。
有什么建议吗?
谢谢!
发布于 2018-02-05 06:37:47
假设你有一些样本和一个公平的抽样函数
// 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只需调整样本以包含更多您希望更频繁出现的数字-下面,0和9的概率(3/14)比之前(1/10)更高
// 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。这是你编写程序的地方,如果你遇到困难,分享它并寻求帮助。
发布于 2018-02-05 07:18:20
基本上,您所要做的就是将所有单元格的概率相加,然后选择一个随机数&乘以这个和。
现在循环您的概率矩阵,并从随机数总数中减去,直到小于0。这就是你想要的。
下面是一个简单的例子,它是一个3x3矩阵,单元格4(中间一个)的概率是其余单元格的一半,所以单元格4应该被选中的次数是其余单元格的一半。
ps。单元格4,如0-8,..不是1-9,因为数组是从零开始的。
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);
https://stackoverflow.com/questions/48613640
复制相似问题