数组随机shuffle方法

1、c++自带的shuffle()函数

在Python中我们会经常看到shuffle的随机排列函数,其可以将列表中的内容进行随机排列,但在C++中却需要自己去实现这样功能的函数(c++0x之前)。在c++0x之后这样的功能函数在标准库中已有对应的提供——std::shuffle。下面就对该函数做具体的介绍:

template <class RandomAccessIterator, class URNG>
void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);

函数功能:使用随机生成器g对元素[first, last)可行交换的容器内部元素进行随机排列,大概原理类似如下代码的功能

template <class RandomAccessIterator, class URNG>
void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g)
{
  for (auto i = (last-first) - 1; i > 0; --i) {
    std::uniform_int_distribution<decltype(i)> d (0,i);
    swap (first[i], first[d (g)]);
  }
}
函数必须与标准库默认的随机生成器一起使用,随机生成器的头文件是<random>。如果要使用不需要传入随机生成器函数可以参照random_shuffle函数。

参数:

first, last
顺序容器迭代器的开头(begin)和结尾(end),在[first, end)这个区间内的数值将会被随机排序。顺序容器的迭代器必须是定义有swap函数的数据类型以及顺序容器也必须支持元素可交换。
g
唯一随机数生成器的一个实例,在头文件<random>中定义。 URNG  是  uniform random number generator 的缩写。

返回值:

None

用例:

#include <iostream>
#include <vector>
#include <algorithm> // std::move_backward
#include <random> // std::default_random_engine
#include <chrono> // std::chrono::system_clock
 
int main (int argc, char* argv[])
{
    std::vector<int> v;
 
    for (int i = 0; i < 10; ++i) {
        v.push_back (i);
    }
 
    // obtain a time-based seed:
    unsigned seed = std::chrono::system_clock::now ().time_since_epoch ().count ();
    std::shuffle (v.begin (), v.end (), std::default_random_engine (seed));
 
    for (auto& it : v) {
        std::cout << it << " ";
    }
 
    std::cout << "\n";
 
    return 0;
}

2、python自带shuffle()函数

import random
alist = [1,2,3,4,5]
random.shuffle(alist)
print(alist)

3、c++自己实现shuffle()函数

#include <iostream>
#include <cstdlib>
#include <ctime>
#define random(a,b) (rand()%(b-a)+a)

void shuffle(vector<int> & array)
{

    int nsize = array.size();
    int n;
    for(int i = 0; i < nsize; i++)
    {
        int tmp = random(i, nsize-1);
        n = array[i];
        array[i] = array[tmp];
        array[tmp] = n;

    }
}

 

4、python自己实现shuffle()函数

import random
list = [0, 1, 2, 3, 4, 5]
print(list)

def shuffle(input):
    num = len(input)
    for i in range(num):
        tmp = random.randint(i, num-1)
        input[i], input[tmp] = input[tmp], input[i]
    return input


list = shuffle(list)
print(list)

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值