StrangeInterviewQuestion
实现一个随机算法,要求每次返回1-100中的一个数,每次都不重复,每个数返回的几率均等,并且每次只能使用一次random函数。
这是一个非常好的面试题。以下是我的解答:
实现思路:
- 初始化一个大小为100的数组,用于存储1-100的数字。
- 使用Fisher-Yates洗牌算法对数组进行随机打乱。该算法能够保证每个数字被等概率地放置在任意位置。
- 维护一个指针,初始指向数组的第一个元素。每次调用函数时,返回指针所指的元素,并将指针向后移动一位。
- 当指针移动到数组末尾时,重新对数组进行洗牌,并将指针重置为数组起始位置。
具体实现代码:
1 |
|
代码说明:
- 使用
std::vector<int>
存储1-100的数字。 - 在构造函数中初始化数组,并调用
shuffle()
函数对数组进行第一次洗牌。 shuffle()
函数使用std::random_device
和std::mt19937
生成随机数引擎,并调用std::shuffle()
函数对数组进行随机打乱。next()
函数每次调用时返回index
指针所指的元素,并将index
加1。当index
达到100时,重新调用shuffle()
函数对数组洗牌,并将index
重置为0。
这样实现的随机算法可以保证:
- 每次返回的数字都在1-100之间,且不重复。
- 每个数字返回的概率相等。
- 每次只调用一次
std::shuffle()
函数,满足题目要求。
算法的时间复杂度为O(1),空间复杂度为O(100),是一个非常高效的实现。
希望这个解答对你有所帮助。如果还有任何问题,欢迎随时提出。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 /0Solving1/!