C++ rand()用法 以及洗牌算法应用

1.rand()函数存在于<stdlib.h>头文件中

2.是一个无参内置函数 作用是随机产生0 - (N-1)之间的数

3.例如 我们要随机一个在 0 - 9 的随机数 int num = rand() %10 ;(左开右闭)

难道随机的只能是从 0 开始的么(是,但是我们可以在随机产生的数后面加上一个数就可以按照我们的想法来取区间)

 例如我们需要从 5 - 13 的随机数 我们可以产生一个从 0 - 8 的随机区间 然后在这个随机区间后面加上 5 就是 5 - 13 的了   --->  int num = rand() % 9 + 5

一定要注意 我们rand()后面的那个数 是【0 ,num) 取不到最后一个数的

洗牌算法:

 

假设原本有N个座位(是连续并排的),那每一节课我都想让学生们随机的坐位置,其实我就是从第一个位置开始随机的选择一个同学让他过来坐(原来座位上是有人的,所以我们就交换他们的座位),按照顺序 从头到尾分配每一个座位对应的学生。

具体实现就是 分配第 i 个座位的时候 随机选择i - (n-1)的学生过来坐(i 坐到i也是可以的,随机嘛,我两次坐同一个座位也是可以的)

i :开始分配第几个座位了

 i = 0    我有n种选择 所以概率 = 1 / n;

 i = 1    因为前面一个座位已经选择好学生了 那我选择的学生的比例只有 (n-1)/n 了 那我在n-1 中选一个 P = ((n - 1) / n ) * (1 / (n - 1)) = 1 / 2

i = 2  同理  P  = ((n - 1) /n ) * (1 / (n - 2))  = 1 / n

·

·

·

 所以我们的算法是正确的

例题:力扣384

给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。

实现 Solution class:

Solution(int[] nums) 使用整数数组 nums 初始化对象
int[] reset() 重设数组到它的初始状态并返回
int[] shuffle() 返回数组随机打乱后的结果
 

示例:

输入
["Solution", "shuffle", "reset", "shuffle"]
[[[1, 2, 3]], [], [], []]
输出
[null, [3, 1, 2], [1, 2, 3], [1, 3, 2]]

解释
Solution solution = new Solution([1, 2, 3]);
solution.shuffle();    // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。例如,返回 [3, 1, 2]
solution.reset();      // 重设数组到它的初始状态 [1, 2, 3] 。返回 [1, 2, 3]
solution.shuffle();    // 随机返回数组 [1, 2, 3] 打乱后的结果。例如,返回 [1, 3, 2]
 

提示:

1 <= nums.length <= 200
-106 <= nums[i] <= 106
nums 中的所有元素都是 唯一的
最多可以调用 5 * 104 次 reset 和 shuffle

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shuffle-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

交换是随机选择 从 i 到 n-1的区间 
利用 rand() 特性 我们 int pos = rand () % (n - i) + i;
class Solution {
private:
    vector<int>nums;     
public:
    Solution(vector<int>& nums) {
        this->nums = nums;       //拷贝构造
    }
    vector<int> reset() {
        return nums;     //返回nums
    }
    
    vector<int> shuffle() {     //返回随机打乱后的结果
        //洗牌算法
        //每一次交换 选择i 到n - 1 的数
        int n = nums.size();
        vector<int>tmp = vector<int>(nums);
        for(int i = 0;i < n; i++){
            //选取的是 i 到 n-1的数
            int pos = rand() % (n - i) + i;
            sawp(tmp, i, pos); 
        }
        return tmp;     
    }
    void sawp(vector<int>& nums, int i, int j){
        int t = nums[i];
        nums[i] = nums[j];
        nums[j] = t;
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* obj = new Solution(nums);
 * vector<int> param_1 = obj->reset();
 * vector<int> param_2 = obj->shuffle();
 */

猜你喜欢

转载自blog.csdn.net/qq_52245648/article/details/121480607