首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在两个值之间生成一个随机数,并优先选择更接近限制的数

如何在两个值之间生成一个随机数,并优先选择更接近限制的数
EN

Stack Overflow用户
提问于 2018-02-05 06:28:24
回答 2查看 152关注 0票数 1

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

如下所示:

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

有什么建议吗?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2018-02-05 06:37:47

假设你有一些样本和一个公平的抽样函数

代码语言:javascript
复制
// 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)更高

代码语言:javascript
复制
// 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。这是你编写程序的地方,如果你遇到困难,分享它并寻求帮助。

票数 2
EN

Stack Overflow用户

发布于 2018-02-05 07:18:20

基本上,您所要做的就是将所有单元格的概率相加,然后选择一个随机数&乘以这个和。

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

下面是一个简单的例子,它是一个3x3矩阵,单元格4(中间一个)的概率是其余单元格的一半,所以单元格4应该被选中的次数是其余单元格的一半。

ps。单元格4,如0-8,..不是1-9,因为数组是从零开始的。

代码语言:javascript
复制
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);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48613640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档