随机生成0到n之间的m个数

分析:使用knuth算法:

void PutRand(int n,int m)

{

srand(time(NULL));

for (int i=0;i<n;i++)

{

if(rand()%(n-i)<m)

{

cout<<i<<endl;

m--;

}

}

}

证明:

1、当i=0时,则生成的随机数是0,1,2...n-1之间的数,共n个;这是0被选到的概率为m/n。

2、当i=1时,生成的随机数是0,1,2...n-2之间的数,共n-1个;假设上次0被选到,那么这次1被选中的概率为(m-1)/(n-1),假设上次0没有被选到,那么这次1选到的概率为m/(n-1)。因此这次1被选中的概率为[m/n]*[(m-1)/(n-1)]+[(1-m/n)]*[m/(n-1)]=[m*(m-1)]/[n*(n-1)]+[(n-m)/n]*[m*(n-1)]=(m^2-m)/[n*(n-1)]+(n*m-m^2)/[n*(n-1)]=(n*m-m)/[n*(n-1)]=m/n。和第一次的概率相同。

3、可得,第i次产生i的概也为m/n,符合题意。

其他方法略。

时间: 2024-10-29 19:08:09

随机生成0到n之间的m个数的相关文章

PYTHON练习题 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数。

Python 练习 二. 使用random中的randint函数随机生成一个1~100之间的预设整数让用户键盘输入所猜的数,如果大于预设的数,屏幕显示"太大了,请重新输入"如果小于预设的数,屏幕显示"太小了,请重新输入"如此循环,直到猜中,显示"恭喜你,猜中了!共猜了N次"N为用户猜测次数. 答案: import random def guess_number(): true_num = random.randint(1, 100) user_n

C语言实现随机生成0或1

rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数.如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的.srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的"随机".通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列.

【剑指offer】统计0到n之间1的个数[数学]

问题描述 给定一个十进制整数N,求出从1到N的所有整数中出现"1"的个数. 例如:N=2时 1,2出现了1个 "1" . N=12时 1,2,3,4,5,6,7,8,9,10,11,12.出现了5个"1". //暴力求解 long CountOnes(long n) { int i,j;//循环变量 int ncount=0;//计数 for (i=1; i<=n; i++) { j=i; while(j!=0) { if (j%10==1

统计0到n之间1的个数[数学,动态规划dp](经典,详解)

问题描述 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数.  例如:N=2时 1,2出现了1个 “1” . N=12时 1,2,3,4,5,6,7,8,9,10,11,12.出现了5个“1”. 方法一 暴力求解 最直接的方法就是从1开始遍历到N,将其中每一个数中含有“1”的个数加起来,就得到了问题的解. 下面给出代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int

统计0到n之间1的个数

问题描写叙述 给定一个十进制整数N,求出从1到N的全部整数中出现"1"的个数. 比如:N=2时 1,2出现了1个 "1" . N=12时 1,2,3,4,5,6,7,8,9,10,11,12. 出现了5个"1". 解题思路 1位数的情况: 在解法二中已经分析过,大于等于1的时候.有1个,小于1就没有. 2位数的情况: N=13,个位数出现的1的次数为2.分别为1和11,十位数出现1的次数为4,分别为10,11,12,13,所以f(N) = 2+4

随机生成一组不重复的随机数组

public string RadomNumArray() { Random r = new Random(); int a = 0; int[] num = new int[6]; string text = ""; for (int i = 0; i < 6; i++) {//循环生成6个数字 a = r.Next(0, 99);//随机生成0到99之间的数字 num[i] = a; for (int k = 0; k < num.Length; k++) {//遍历数

转:在0~N(不包括N)范围内随机生成一个长度为M(M &lt;= N)且内容不重复的数组

1. 最朴素暴力的做法. void cal1() { int i = 0, j = 0, num = 0; int result[M]; result[0] = rand() % N; //第一个肯定不重复, 直接加进去 for (i = 1; i < M; i++) //获得剩下的(M-1)个随机数 { num = rand() % N; //生成0 ~ N之间的随机数字 for (j = 0; j < i; j++) { if (num == result[j]) //如果和result数

iOS之两圆之间标准圆的随机生成

相信很多社交产品中,肯定会存在寻找附近人或者附近商家的需求,类似下图,在大圆和小圆之间(橘色区域)生成一系列的随机圆,并且所有随机圆之间也不能有交集,我暂且称这种圆为标准圆. 关于这样的需要以前在做项目中有同事做过,虽然可以实现了上面的效果图,但是坐标及半径都是写死,从写死的数据随机取值,看上去是满足了,但是对于用户来说多次使用该功能时,肯定有一定的视觉疲倦,且写死的一些数据真的不好写,如果大圆或者小圆半径变化了,或者需要更多的标准圆,那怎么办呢?一脸懵逼?? 思路一: 对于这个需求,我一开始也

随机生成一份试卷,试卷的种类分为单选、多选、判断三种题型。nodejs6.0 mysql

背景:从数据库中,随机生成一份试卷,试卷的种类分为单选.多选.判断三种题型. 首先我需要生成随机数id(在这之前我需要知道数据库中各个题型的题数,这样我才能设置随机数),并依据生成的随机数id,去查找对应的题目.而在js的数组操作中,有filter.splice.concat.every.find等等.我需要从数据库中取出特定的数据,而我返回的是一组对象,那么我需要过滤出特定的部分. 代码如下: var danxuan = getRandomNum(danxuan_count,20);var d