C++大随机整数的产生,排序和查找

本文探讨如何在C++中生成大量大随机数(范围在0~10^8-1之间)并进行排序和高效查找。通过分析随机数生成的均匀性问题,提出了一种改进的随机数生成算法,并利用统计方法减少存储需求,实现O(range)空间和O(n)时间复杂度的排序算法,以及基于统计的高成功率快速查找方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里想记录一个之前遇到的一个很有意思的与大随机数相关的问题,也是自己长时间琢磨出来的结果,这里想分享一下;

先在这里列出结果方便读者看是否相关,以免浪费你的时间,这里想通过一个小例子得出如下的结果:

1) 通常的离散型均匀分布的产生;

2) 大随机数的离散型均匀分布的产生;

3) 大量数据,在范围已知或可估计的条件下的,简单快速排序算法:O(range)的空间O(n)的时间

4) 数据分布可估计时的基于统计的高成功率的快速查找,进一步的节省空间和时间,且错误概率可控,直至为零

如果想来看看,你爱我们就开始了:

首先给出问题(很短,其实就一句话): 

        生成N=10^12个范围在0~(10^8)-1之间的整数,并找出其中第N/2大和第N/4大的数。

        咋看之下这个问题似乎很简单,只是数据量很大而已。可是仔细一想似乎数据大的有点多了,因此其存储倒是问题(因为我们后面还需要寻找N/2大和第N/4大的数),还有一个问题就是,C++中的rand()生成的随机数是不会超过RAND_MAX(0x7fff)的,而RAND_MAX是小于(10^8)的,所以随机数的生成也是一个问题,还有就是,即便我们可以生成10^8的随机数,但是如果10^8进一步变大的话(如:变为10^9)还是会面临随机数生成的问题,所以有必要找到一种利用已有随机数生成函数生成大随机数的方法。

        首先这里先来解决第一个问题,大随机数生成:

        其实,看到这个问题可能很多人已经想到解决方案了,或者是google之,或者是baidu之,都可以得到几种解决方案,

        例如:

        示例1(注意这样是有问题,下面会分析):

                      srand(time(NULL));

                       int  r1=rand()%10000;

                       int r2=rand()%10000;

                       int re=r1*r2;

        示例2(这里也有点问题,下面会解决):

                        srand(time(NULL));

                       int  r1=rand()%10000;

                       int r2=rand()%10000;

                       int re=r1*10000+r2;

      如果你对为随机数的生成方法比较熟悉的话那么你也可以自己写一个随机数生产函数,如 http://blog.youkuaiyun.com/suiyunonghen/article/details/3863260 所做的那样,但是我们可能更愿意使用C++标准提供的随机数生产函数,而且博文中关于随机数种子的部分处理得并不理想,因而这种方法存在一些问题,文中自己也有提到。

      而对于第一种方法,他是最不推荐使用的方法,理由如下:

     首先,我们需啊明白的的是,这里所说的随机数是指均匀分布,也就是:P(re=n)=1/N这里N=10^8,re就是产生的随机数,而示例1产生的随机数根本就不是均匀分布(这里我们假设rand()%10000是服从均匀分布的,(其实这会有一点问题,但是后面会细说并改正它,这里先使用后面的结果):

     证明: 

              其实要证明他不是均匀分布只需要举出一个反例就好了,以上面的情况为例:示例1中的算法产生数字6的情况为:(r1, r2)=(1,6)或(2,3)或(3,2)或(6,1),每一个的概率为1/N*1/N*6=1/10000*1/0000*6=6/(10^8)但是对于数字10001,示例1中的代码是根本不可能产生的,而其进一步的我们可以看到的是这种现象是普遍存在的,而并是特例,这是上面的代码的固有问题。

       对于示例2,类似于前面的步骤,这里先计算取到0~(10^8)-1之间任意一个数的概率,根据示例2中的代码这里利用如下的步

### 如何生成10个升序排列的随机整数并执行二分查找 为了完成这一目标,可以通过以下方式实现: #### 1. 随机数生成与排序 首先需要生成一组随机整数,并将其按升序排列。这一步骤可以利用编程语言自带的库来简化过程。 #### 2. 使用二分查找算法 由于二分查找仅适用于已排序的数据结构[^3],因此在生成随机数之后需对其进行排序处理。以下是具体实现代码示例: --- ### C++ 实现方案 ```cpp #include <iostream> #include <vector> #include <algorithm> // std::sort #include <cstdlib> // rand(), srand() #include <ctime> // time() int binarySearch(const std::vector<int>& arr, int target) { int low = 0; int high = arr.size() - 1; while (low <= high) { int mid = low + (high - low) / 2; // 计算中间位置 if (arr[mid] == target) { return mid; // 找到目标值返回索引 } else if (arr[mid] < target) { low = mid + 1; // 调整左边界 } else { high = mid - 1; // 调整右边界 } } return -1; // 如果未找到返回-1 } int main() { srand(static_cast<unsigned>(time(0))); // 设置随机种子 std::vector<int> randomNumbers; // 生成10个随机整数 for (int i = 0; i < 10; ++i) { randomNumbers.push_back(rand() % 100); // 假设范围为[0, 99] } // 对随机数组进行排序 std::sort(randomNumbers.begin(), randomNumbers.end()); // 输出排序后的数组 std::cout << "Sorted Random Numbers: "; for (const auto& num : randomNumbers) { std::cout << num << " "; } std::cout << "\n"; // 用户输入待查数值 int target; std::cout << "Enter a number to search: "; std::cin >> target; // 进行二分查找 int resultIndex = binarySearch(randomNumbers, target); if (resultIndex != -1) { std::cout << "Number found at index: " << resultIndex << "\n"; } else { std::cout << "Number not found.\n"; } return 0; } ``` 上述代码实现了如下功能: - 利用 `std::vector` 存储动态小的随机数集合。 - 使用 `std::sort()` 函数对随机数进行升序排序[^4]。 - 定义了一个通用的二分查找函数 `binarySearch` 来定位目标值的位置。 --- ### Python 实现方案 Python 提供了更简洁的方式来进行列表操作排序,下面是一个完整的解决方案: ```python import random def binary_search(arr, target): low, high = 0, len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid # 返回匹配项的索引 elif arr[mid] < target: low = mid + 1 # 移动左侧边界 else: high = mid - 1 # 移动右侧边界 return -1 # 若找不到,则返回-1 # 主程序部分 random_numbers = [random.randint(0, 99) for _ in range(10)] # 生成10个随机整数 sorted_numbers = sorted(random_numbers) # 排序这些随机数 print(f"Sorted Random Numbers: {sorted_numbers}") # 显示排序后的结果 target = int(input("Enter a number to search: ")) # 获取用户输入的目标值 index = binary_search(sorted_numbers, target) if index != -1: print(f"Number found at index: {index}") else: print("Number not found.") ``` 此代码片段涵盖了以下几个要点: - 使用列表推导式生成指定数量的随机整数。 - 应用了内置的 `sorted()` 方法对列表进行升序排序。 - 自定义了二分查找逻辑以适应不同场景需求。 --- ### 总结 无论是采用 C++ 或者 Python 编程语言,都可以轻松达成题目所描述的任务——即先创建一个由随机整数组成的升序序列再应用高效的二分查找技术去检索特定元素是否存在以及其确切位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值