JavaScript需求:基于短源数组生成指定长度均匀随机数组
生成均匀分布的目标数组解决方案
需求说明
- 生成长度为
elementsToGenerate(此处为10)的数组 - 所有元素必须来自给定的
sourceArray(此处为[3, 6, 9]) - 源数组中的每个元素至少出现一次
- 元素在目标数组中尽可能均匀分布
实现思路
- 基础数量计算:先算出每个元素的基础出现次数(总长度除以源数组长度取整),确保每个元素至少出现一次
- 补充剩余元素:将总长度减去基础数量总和的剩余部分,随机分配给部分源元素
- 打乱数组:将组装好的数组打乱,保证元素分布均匀
代码实现
const sourceArray = [3, 6, 9]; const elementsToGenerate = 10; function generateBalancedArray(source, targetLength) { // 校验:目标长度必须不小于源数组长度,否则无法保证每个元素至少出现一次 if (targetLength < source.length) { throw new Error('目标长度不能小于源数组长度'); } const baseCount = Math.floor(targetLength / source.length); const remainder = targetLength % source.length; const result = []; // 添加基础数量的每个元素 source.forEach(item => { result.push(...Array(baseCount).fill(item)); }); // 随机选择remainder个元素补充到结果中 const shuffledSource = [...source].sort(() => Math.random() - 0.5); result.push(...shuffledSource.slice(0, remainder)); // 打乱最终数组,确保分布均匀 return result.sort(() => Math.random() - 0.5); } // 生成并打印结果 const targetArray = generateBalancedArray(sourceArray, elementsToGenerate); console.log(targetArray);
代码说明
- 校验逻辑:提前判断目标长度是否合法,避免无法满足每个元素至少出现一次的要求
- 基础元素填充:用
Array(baseCount).fill(item)快速生成重复元素,简化代码 - 剩余元素分配:先打乱源数组再取前
remainder个元素,避免固定给某个元素增加次数 - 最终打乱:通过随机排序让元素分布更均匀,符合示例输出的随机性
示例输出(每次运行结果不同,均符合要求):
[3,9,6,6,3,9,6,3,3,9]
[9,6,3,9,6,9,3,9,3,6]
内容的提问来源于stack exchange,提问作者1Mayur
相关产品推荐
相关产品推荐

