我正在实施一个基本上扮演Battle Ships游戏的AI系统。 此AI的一部分包括将船舶放置在板上。这应该是一个随机过程,但是统计数据显示,如果您将船只靠近棋盘边缘,则更有可能赢得比赛。
所以,说船可以在X(0到9之间)和Y(0到9之间)的任何位置我想实现一个算法,它可以生成0到9之间的随机整数,返回概率更高数字接近0或接近9(4和5的数字不太可能返回)。这将是一个javascript算法,但任何使用伪代码的直觉都会受到赞赏。
有什么建议吗?
谢谢!
答案 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
只需调整样本以包含您希望更频繁显示的更多数字 - 下面,0
和9
的概率(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,因为数组是基于零的。
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;