生成0到9的随机排列,每一个数据只出现一次,每次运行结果不一样。
1、解题思路:利用rand()函数随机生成10个数,然后对其排序,此时的原始数据的下标就是0到9的随机顺序
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void swap(int a[], int i, int j) //交换数据
{
int t;
t=a[i];
a[i]=a[j];
a[j]=t;
}
void insort(int a[], int b[], int n) //升序排序
{
int i,j;
for(i=0; i<9; i++)
{
for(j=i+1; j<9; j++)
{
if(b[j]<b[i])
{
swap(b,i,j);
swap(a,i,j);
}
}
}
}
void randnumber(int a[], int n)
{
int i;
int b[9];
srand((unsigned int)time(NULL));
for(i=0;i<9;i++)
{
b[i]=rand()%9+1;
a[i]=i+1;
}
insort(a,b,n);
}
int main()
{
int a[9];
int i;
randnumber(a,9);
for(i=0;i<9;i++)
printf("%d ",a[i]);
return 0;
}
参考资料:https://blog.csdn.net/cighao/article/details/49072111
2、利用C++自带的shuffle函数,函数功能:使用随机生成器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的缩写。
#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;
}