理解算法 !高效代码生成 无重复的随机数_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 理解算法 !高效代码生成 无重复的随机数

理解算法 !高效代码生成 无重复的随机数

 2013/12/10 22:09:06  guangqiang  程序员俱乐部  我要评论(0)
  • 摘要:#include<stdio.h>#include<time.h>#include<stdlib.h>#defineN1000#defineM10intmain(){srand(time(NULL));intm=M;for(inti=0;i<N;i++){if((rand()%(N-i))<m)//此处rand()%(N-1)出现每一个小于(N-i)的数的概率是一样的{//被取到,m值减1,输出结果im--;printf("%d\n",i);}
  • 标签:代码 理解 算法
class="java" name="code">#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
#define N 1000
#define M 10
 
int main()
{
 srand(time(NULL));
  
 int m = M;
  
 for (int i = 0; i < N; i++)
 {
  if ((rand()%(N - i)) < m)   //此处rand()%(N - 1)出现每一个小于(N - i)的数的概率是一样的
  {  //被取到,m值减 1 ,输出结果 i 
   m--;
   printf("%d\n", i);
  }
 }
  
 return 0;
}

?如果上面的比较难理解 可以先参考下面的普通办法

 #include<iostream>
#include<time.h>
#define N 100
int a[N];//结果数组
void swap(int& i,int& j)
{
 int temp=i;
 i=j;
 j=temp;
}
int main()
{
 int i=0;
 for(i=1; i<=N; i++)
 {
  a[i]=i;
 }
 srand(unsigned(time(NULL)));
 for(i=N-1; i>0; i--)
 {
  swap(a[i], a[rand()%i]);
 }
 return 0;
}
 
/*
解决思路:
这个问题的实际应用就比如要随机生成一副扑克牌,54张,顺序是乱的,但显然牌面不能重复。用随机数生成器生成的数总是会重复的,所以,不能把生成的数直接保存下来作为结果。那么怎么办?

你想想,如果是真实的扑克牌,你是怎么打乱的?你会说:洗牌啊!没错,就是洗牌!洗牌是什么过程?说白了,是交换!把两摞牌交换位置,用类似的方法就可以解决楼主的问题。

先按顺序在数组里生成1-100的数,然后产生一对0-99之间的随机数,把这两个数所表示下标的数交换位置,如此重复几十次,原先的数组就被打乱了。*/

?

?

发表评论
用户名: 匿名