C++编写生成不重复的随机数代码

 更新时间:2015年05月19日 15:43:49   投稿:hebedich  
本文给大家汇总介绍了3种c++实现生成不重复的随机数的函数,十分的简单实用,有需要的小伙伴可以参考下。

C++编写生成不重复的随机数代码

vector<int> getRandom(int total)
{
  srand((int)time(NULL));
  std::vector<int> input = *new std::vector<int>();
  for (int i = 0; i < total; i++) {
    input.push_back(i);
  }
  vector<int> output = *new vector<int>();
   
  int end = total;
  for (int i = 0; i < total; i++) {
    vector<int>::iterator iter = input.begin();
    int num = random()%end;
    iter = iter+num;
    output.push_back(*iter);
    input.erase(iter);
    end--;
  }
   
  return output;
}

再来一例:

void permutation(int n, int *z_array)
{
  int i, j, k, z;
  int buffer[N];

  /* 初始化数组 */
  for (i=0; i<n; i++)
    buffer[i]=0;

  /* 准备生成随机数,以当前时间为种子 */
  srand((unsigned)time((long *)0));

  /* 获得不重复的随机数据 */
  for (i=0; i<n; i++) {
    /* 获得0~(n-i)的随机数据 */
    z = rand()%(n-i);
    j=0; k=0;
    while (j<=z) {
      if (buffer[j+k]==0) j++;
      else k++;
    }
    buffer[j+k-1]=1;
    z_array[i]=j+k-1;
  }
  return;
}

方法三:来个复杂点的

#include<stdio.h>
#include <time.h>
#include "iostream"
#include <math.h>
#define N 53
using namespace std;

//print array
void display(int *a)
{
    for (int i =0;i<N;i++)
    {
      cout<<" "<<a[i]<<" ";
    }

}

int main(void)
{

  int b[N],a[N];
  for (int i =0;i<N;i++)
  {
    b[i] = i+1;
  }
  // random(a);
  srand((unsigned)time(NULL));
  int MaxIndex = N;
  for ( i= 0;i<N;i++)
  {

  // 
    int index = (int)rand()%MaxIndex;//随机一个 0 - 52的index
    a[i] = b[index];    //随机到的数字给a[i],i from 0 to N-1
    b[index] = b[MaxIndex-1];
    MaxIndex--;

  }
    display(a);
  return 0;
} 

以上3种方法均可实现生成不重复的随机数,具体的效率如何,小伙伴们自己测试下吧。

相关文章

  • C++ ostream用法案例详解

    C++ ostream用法案例详解

    这篇文章主要介绍了C++ ostream用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++ 超详细深入分析单例模式

    C++ 超详细深入分析单例模式

    单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建
    2022-03-03
  • C语言实现简单的三子棋项目

    C语言实现简单的三子棋项目

    这篇文章主要为大家详细介绍了C语言实现简单的三子棋项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言深入讲解函数的使用

    C语言深入讲解函数的使用

    各位小伙伴们,今天YU同学给大家带来的是与函数相关的知识,本篇将会带着大家初步认识和调用函数来解决一些简单的问题
    2022-04-04
  • c++实现单纯形法现行规划问题的求解(推荐)

    c++实现单纯形法现行规划问题的求解(推荐)

    这篇文章主要介绍了c++实现单纯形法现行规划问题的求解,本文针对问题通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C语言中关于动态内存分配的详解

    C语言中关于动态内存分配的详解

    动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存。栈上分配的内存是由系统分配和释放的,空间有限,在复合语句或函数运行结束后就会被系统自动释放而堆上分配的内存则不会有这个问题。
    2021-09-09
  • C语言打印某一年中某月的日历

    C语言打印某一年中某月的日历

    本文详细讲解了C语言打印某一年中某月的日历,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • C读txt到二维数组的实现方法

    C读txt到二维数组的实现方法

    下面小编就为大家带来一篇C读txt到二维数组的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 使用C++实现插件模式时的避坑要点(推荐)

    使用C++实现插件模式时的避坑要点(推荐)

    这篇文章主要介绍了使用C++实现插件模式时的避坑要点,本文主要分析实践中常见的、因为对原理不清楚而搞出来的产品里的坑,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • C语言八道笔试题精讲带你掌握指针

    C语言八道笔试题精讲带你掌握指针

    C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对指针的掌握是非常重要的,本文将具体针对指针的基础做详尽的介绍
    2022-07-07

最新评论