千家信息网

c++怎么实现数据伪造

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"c++怎么实现数据伪造"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"c++怎么实现数据伪造"文章能帮助大家解决问题。大致需求是已知一批数和每
千家信息网最后更新 2026年11月03日c++怎么实现数据伪造

这篇文章主要介绍"c++怎么实现数据伪造"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"c++怎么实现数据伪造"文章能帮助大家解决问题。

大致需求是已知一批数和每个数出现的次数,然后写个接口,每次调用都能返回已知数据中的某个数,且返回的概率和原始数据中每个数出现的概率一致,题目描述起来有些绕口,我们来举个实际的例子。

以上面的输入为例,要求实现的接口必须以11.96%的概率返回5、18.10%的概率返回91……16.55%的概率返回98,当然我的要求不仅仅是这几个数,而是可能有10^5个数。 先别急着往下看,给你几分钟先思考下。

各种语言其实都内置了random函数,可以随机返回int或者long型的随机数,这里我们先不考虑溢出的问题。为了方便讲解,假设我们已有n个数存在在num[n]中,其出现的频次存放在fre[n]中。 借助已有的random(),我们很简单就可以生成0-n之间的一个随机数i,但是如果直接返回num[i]的话,每个数返回的概率是一致的,明显不满足我们的需求。

其实解决方案也很简单,我们按照每个数出现的频次大小,将其映射成不同的区间大小,出现的概率越大,区间越大。想象下,这些数据按不同的区间大小把一个飞镖盘分成不同的部分,我们生成数的时候就是拿个飞镖随机扎,扎到哪个算哪个。

当然我们可以直接用一位直线区间描述上面的二维飞镖盘模型。只需要随机生成0-100%之间的数即可,假设某次随机生成的数是0.65(65%),我们算一下 正好对应在数字58对应的区间上,所以这次直接返回58就是了,我们可以开始写代码了。

    int[] num; // 数字    int[] fre; // 出现的频次    double[] pro;  // 出现的概率    int n;  // 数据量    void init() {        int sum = 0;        for (int i = 0; i < n; i++) {            sum += fre[i];        }        for (int i = 0; i < n; i++) {            pro[i] = fre[i]/sum; // 计算出每个数出现的概率         }    }        int getRandom() {        double rp = random.getNextDouble();        double sum = 0;        for (int i = 0; i < n; i++) {            if (sum >= r && sum + pro[i] > rp) {  //找到命中的区间                return num[i];             }            sum += pro[i];        }        return num[n-1];    }

似乎一切都很完美,但每次getRandom()的时间复杂度是O(n),大量的使用性能也抗不太住。有没有更好的实现方式?既然写到这里了,必然是有的。

上面代码循环中有个sum += pro[i]; 每次计算都要累加,我们是不是可以提前在init()中累加好?然后你会发现因为每次累加的数都只正数,所以pro是个递增序列,对于有序序列的查找 二分必然是首选。这时候我们可以用二分重写上面代码。

    int[] num; // 数字    int[] fre; // 出现的频次    double[] pro;  // 出现的概率    int n;  // 数据量    void init() {        int sum = 0;        for (int i = 0; i < n; i++) {            sum += fre[i];        }        for (int i = 0; i < n; i++) {            pro[i] = fre[i]/sum; // 计算出每个数出现的概率            if (i != 0) {                pro[i] += pro[i-1];            }        }    }    int getRandom() {        double rp = random.getNextDouble();        int l = 0;        int r = n-1;        while (l != r) {   // 二分查找确定区间位置              int mid = (l + r) >> 1;            if (pro[mid] < rp) {                l = mid + 1;            } else {                r = mid;            }        }        return num[n-1];    }

关于"c++怎么实现数据伪造"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

概率 数据 区间 不同 频次 生成 c++ 个数 代码 大小 数字 知识 飞镖 一致 之间 实际 就是 序列 必然 接口 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司排名 广东万易互联网科技有限公司惠州分公司 丰台科技园 互联网 一五八零互联网科技 人人互联网科技是培训 互联网金融科技委员会 广西拼得多互联网科技有限公司 博兴的互联网电子科技公司 移动互联网科技股 互联网经济与金融科技 湖北码尼互联网科技有限公司电话 互联网第三次科技革命特征 电子商务与互联网科技的关系 银行科技岗属于互联网吗 本届互联网大会上的黑科技 互联网科技手抄报图片 北京互联网科技类企业分布 求路客互联网科技电话 前海云享互联网科技 科技发展第三阶段互联网时代 智能科技公司是互联网公司吗 碳银互联网科技 互联网科技logo设计 互联网之后的科技是什么 科技互联网大厂 世界互联网科技公司市值排名 特约风豹互联网科技为什么扣费 互联网金融科技公司的优势 广州梦谷互联网科技有限公司领导 互联网对科技影响
0