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之间的随机数,把这两个数所表示下标的数交换位置,如此重复几十次,原先的数组就被打乱了。*/
?
?