10,随机等概率的输出m个不重复的数

今天看到一段代码,可以从0.....n-1中随机等概率的输出m个不重复的数(n远远大于m)。遂记录下来。

首先,产生随机数,不免要用到srand,rand函数。先简单介绍下两个函数。

1,void srand(unsigned int seed);

   初始化随机数生成器,对于每一个不同的seed,每一次调用rand()将会产生不同的随机数序列。

  特别的,当seed == 1时,生成器将会被重新初始化以前的初始化值,那么下次rand产生的随机数将会和第一次rand()相同。

  所以,为了产生真正的随机数,srand()一般用time(0)来初始化seed。

2, int rand(void)

  产生一个0~RAND_MAX的随机数,而产生随机数的算法依赖种子seed。如果要产生一个特点区间的随机数,则可以用modulo的方法

1 v1 = rand() % 100;         // v1 in the range 0 to 99
2 v2 = rand() % 100 + 1;     // v2 in the range 1 to 100
3 v3 = rand() % 30 + 1985;   // v3 in the range 1985-2014

3,等概率产生随机数的方法

  先上代码。

knuth (int n, int m) {
    srand((unsigned int)time(0);
    for (int i = 0; i < n; ++i) {
        if (rand()%(n-i) < m){
            cout << i << endl;
            m--;
        }
    }
}

  由这个for循环循环n次,且在满足条件时才输出i,可知,输出m个不同值的要求已满足,因为每次输出的都是i值,而i值每次都是不一样的,m--保证了程序在输出了m个值后就停止循环。

  在i=0时,rand()%(n-i)的取值范围为0到n-1,共n个数,此时要输出0只需要rand()%(n-i)小于m,故i=0被输出的概率为m/n;

  在i=1时,rand()%(n-i)的取值范围为0到n-2,共n-1个数,若i=0没有被输出,则m--未被执行,此时i=1被输出的概率为m/(n-1),若i=0已经被输出了,则m变为m-1,此时i=1被输出的概率为(m-1)/(n-1);由概率论的知识,可知此时i=1被输出的概率为

P=(1-m/n)*(m/(n-1))+m/n*((m-1)/(n-1))=m/n;以此类推,可知每个数被输出的概率都为m/n

时间: 2024-11-10 05:53:02

10,随机等概率的输出m个不重复的数的相关文章

C++,1....n中随机等概率的输出m个不重复的数(假设n远大于m)。

#include <stdlib.h> #include <time.h> knuth(int n, int m) { srand((unsigned int)time(0)); for (int i = 0; i < n; i++) { if (rand()%(n-i)<m ) { cout << i << endl; m--; } } } 为了方便解释假设n等于10,m等于5:第一次rand()%(n-0)的余数范围是0~9,有可能小于m(=

ORACLE输出详细错误信息错误行数

... COMMIT; --输出成功信息 DBMS_OUTPUT.PUT_LINE('RUN RESULT: SUCCESS'); EXCEPTION WHEN OTHERS THEN BEGIN ROLLBACK; --输出错误信息 dbms_output.put_line(to_char(DBMS_UTILITY.format_error_backtrace) ||chr(10)||to_char(sqlcode) ||chr(10)||'ERROR '||SQLERRM); END; OR

【算法导论学习-012】n个数随机等概率的抽样m个

算法法导论>P129页课后题5.3-7 suppose we want to create a random sample of the set {1,2,3,-,n}, thatis, an m-element subset S, where0≤m≤n, such that each m-subset is equally likely to be created. One waywould be to set A[i]=i for i=1,2,3,-,n, call RANDOMIZE-IN

C语言 有一个整形数组a,有10个元素,要求输出数组中的全部元素

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">有一个整形数组a,有10个元素,要求输出数组中的全部元素</span> 解题思路:引用数组中各元素的值有3种方法:1.下标法,如a[3];2.通过数组名计算数组元素的地址,找出元素的值 3.用指针变量指向数组元素. //用指针变量指向数组元素 #include <std

【c语言】依次将10个数输入,要求输出其中最大的数

// 依次将10个数输入,要求输出其中最大的数 #include <stdio.h> int main() { int a[10]; int i; int temp; printf("请输入10个数:"); for( i = 0; i < 10; i++ ) { scanf("%d",&a[i]); } for( i = 0; i < 10; i++ ) { if( a[i] > a[i+1] ) { temp = a[i];

Linux中一个文件10行内容,如何输出5-8内容到屏幕

题目是这样的,Linux中一个文件10行内容,如何输出5-8内容到屏幕首先我们模拟一下这样的环境: [root@localhost question]# pwd /root/question [root@localhost question]# seq 1 10 > q.txt [root@localhost question]# cat q.txt 1 2 3 4 5 6 7 8 9 10 我们的任务是取5-8行输出: 第一种方法: [root@localhost question]# sed

求从10到100中能被3或5整除的数的和

题目 解答 解答一 public class Test {       public static void main(String[] args) {                   int sum = 0;         for (int i = 10; i < 100; i++) {             if (i % 3 ==0 || i % 5 == 0) {                 sum += i;             }         }         

获取10个1-20之间的随机数,要求不能重复

package cn; import java.util.ArrayList; import java.util.Random; /**  * 获取10个1-20之间的随机数,要求不能重复  *   * 用数组实现,但是数组的长度是固定的,长度不好确定.  * 所以我们使用集合实现.  *   * 分析:  *  1.创建产生随机数的对象  *      2.创建一个存储随机数的集合  *      3.定义统计变量,从0开始,是否小于10  *       是 : 先产生一个随机数,判断该随机

面试题3:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

package siweifasan_6_5; /** * @Description:在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2. * @Parameters: // Parameters: // numbers: an array of integers //