0

0

如何用 JavaScript 实现基于自定义概率密度函数的随机数生成器

霞舞

霞舞

发布时间:2026-02-12 12:48:10

|

257人浏览过

|

来源于php中文网

原创

如何用 JavaScript 实现基于自定义概率密度函数的随机数生成器

本文介绍一种轻量、可扩展的方法,将任意一维函数(如手绘分布曲线)转化为高效采样的随机数生成器,核心采用加权轮盘选择法,兼顾精度与性能,适用于数据可视化中的合成数据生成。

在数据可视化开发中,仅依赖 Math.random() 或标准正态分布(如 d3.randomNormal())往往难以体现设计意图——比如模拟用户停留时长的长尾分布、UI 元素点击热区的双峰密度,或艺术化生成符合手绘轮廓的样本点。此时,我们需要一个能“忠实服从用户定义分布”的随机数生成器:给定一个归一化(或未归一化)的概率密度函数 f(x)(例如从 Observable 图形编辑器导出的 distribution(x)),输出满足该分布形状的随机值 x。

上述需求本质上是从连续(或近似连续)概率密度函数中进行逆变换采样(Inverse Transform Sampling)的替代方案。但由于 f(x) 通常无解析反函数、也不保证可积归一化,直接使用 CDF 逆变换不现实。因此,更实用的工程解法是:离散化 + 加权轮盘选择(Weighted Roulette Wheel Selection)

其核心思想是:

  • 将定义域 [0, 1](或任意区间)划分为 n 个等宽子区间;
  • 在每个区间中点(或左端点)计算 f(x_i) 得到权重 w_i;
  • 将权重累加为总和 W,再生成 [0, W) 内的均匀随机数 r;
  • 顺序累减权重,首个使 r ≤ 累计权重 的索引即为选中区间,返回对应 x_i。

以下是优化后的实现(兼容 D3 v6+,无需外部依赖):

CodeWP
CodeWP

针对 WordPress 训练的AI代码生成器

下载

立即学习Java免费学习笔记(深入)”;

/**
 * 创建一个服从自定义密度函数的随机数生成器
 * @param {Function} fn - 输入 x ∈ [0,1],输出非负密度值 y ≥ 0
 * @param {number} [nbVal=50] - 离散化粒度(越大越精确,但开销略增)
 * @returns {Function} 返回一个无参函数,每次调用生成一个符合分布的随机数
 */
const createDistributor = (fn, nbVal = 50) => {
  // 步骤1:离散化采样,生成权重数组
  const weights = Array.from({ length: nbVal }, (_, i) => {
    const x = i / (nbVal - 1); // 覆盖 [0, 1] 全区间(含端点)
    return Math.max(0, fn(x)); // 防止负值干扰
  });

  // 步骤2:预计算累计权重(提升多次调用性能)
  const cumulativeWeights = [];
  let sum = 0;
  for (let w of weights) {
    sum += w;
    cumulativeWeights.push(sum);
  }
  const totalWeight = sum;

  // 步骤3:闭包内实现高效轮盘选择
  return () => {
    if (totalWeight <= 0) throw new Error('Distribution function returned zero or negative total weight');

    const r = Math.random() * totalWeight;
    // &#20108;&#20998;&#26597;&#25214;&#21152;&#36895;&#65288;O(log n) &#26367;&#20195; O(n) &#32447;&#24615;&#25195;&#25551;&#65289;
    let left = 0, right = cumulativeWeights.length;
    while (left < right) {
      const mid = Math.floor((left + right) / 2);
      if (cumulativeWeights[mid] < r) {
        left = mid + 1;
      } else {
        right = mid;
      }
    }
    // &#26144;&#23556;&#22238;&#21407;&#22987; x &#20540;&#65288;&#32447;&#24615;&#25554;&#20540;&#21487;&#36827;&#19968;&#27493;&#25552;&#21319;&#31934;&#24230;&#65289;
    return left / (nbVal - 1);
  };
};

// &#9989; &#20351;&#29992;&#31034;&#20363;&#65306;&#27169;&#25311;&ldquo;U&#22411;&rdquo;&#20998;&#24067;&#65288;&#20004;&#31471;&#39640;&#12289;&#20013;&#38388;&#20302;&#65289;
const uShaped = x => 1 - 0.8 * Math.sin(Math.PI * x);
const sampleU = createDistributor(uShaped, 100);

console.log(sampleU()); // e.g., 0.023, 0.987, 0.011...

⚠️ 关键注意事项

  • 定义域对齐:本实现默认 x ∈ [0, 1]。若需其他区间(如 [a, b]),请先对输入函数做变量替换:fnScaled = x => fn(a + x*(b-a)),并在返回时还原 return a + (left/(nbVal-1))*(b-a);
  • 非负性保障:fn(x) 应始终 ≥ 0;若原始函数含负值,务必用 Math.max(0, fn(x)) 截断,否则破坏概率意义;
  • 精度与性能权衡:nbVal = 50 对多数可视化场景已足够;100–200 可应对高保真需求;超过 500 通常收益递减;
  • 归一化非必需:算法仅依赖权重相对比例,fn(x) 无需预先积分归一化(极大降低前端计算负担);
  • 进阶优化方向:对高频调用场景,可预生成 LUT(查找表);对严格统计需求,建议结合拒绝采样(Rejection Sampling)或使用专业库(如 mathjs.random.distribution)。

总结而言,该方法以极简代码实现了从“草图式分布”到“可用随机源”的跨越——它不追求理论最优,而聚焦于开发者直觉、调试友好性与运行时效率的平衡,正是现代前端数据可视化工作流中不可或缺的“胶水工具”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

442

2023.08.14

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

1

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

3

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

2

2026.02.12

Next.js全栈开发与SSR服务端渲染实战
Next.js全栈开发与SSR服务端渲染实战

本专题系统讲解 Next.js 框架在现代全栈开发中的应用,重点解析 SSR、SSG 与 ISR 渲染模式的原理与差异。内容涵盖路由系统、API Routes、数据获取策略、性能优化以及部署实践。通过完整项目示例,帮助开发者掌握高性能 SEO 友好的 React 全栈开发方案。

1

2026.02.12

Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

5

2026.02.12

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

194

2026.02.11

Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析
Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析

本专题全面整理了Yandex搜索引擎的官方入口信息,涵盖国际版与俄罗斯版官网访问方式、网页版直达入口及免登录使用说明,帮助用户快速、安全地进入Yandex官网,高效使用其搜索与相关服务。

614

2026.02.11

虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法
虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法

本专题系统整理了虫虫漫画官网及网页版最新入口,涵盖免登录观看、正版漫画全集在线阅读方式,并汇总稳定可用的访问渠道,帮助用户快速找到虫虫漫画官方页面,轻松在线阅读各类热门漫画内容。

94

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号