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

所属分类: 软件编程 / C 语言 阅读数: 75
收藏 0 赞 0 分享

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++中四种对象生存期和作用域以及static的用法总结分析

以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++嵌套类与局部类详细解析

从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定
收藏 0 赞 0 分享

C++空类详解

以下是对C++中的空类进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
收藏 0 赞 0 分享

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
收藏 0 赞 0 分享

C数据结构之单链表详细示例分析

以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C数据结构之双链表详细示例分析

以下是对c语言中的双链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅析如何在c语言中调用Linux脚本

如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
收藏 0 赞 0 分享

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅谈C++中的string 类型占几个字节

本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节
收藏 0 赞 0 分享
查看更多