怎么从m个数中随机选择n个数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么从m个数中随机选择n个数相关的知识,希望对你有一定的参考价值。

参考技术A

组合数公式C(m,n) = m*(m-1) * (m-2) * ... *(m-n+1)/(1*2*3*...*n)

整数数组的前m个直接存下来。

用一个计数器保存当前正在处理的请求是第几个,比如n,对于从m+1开始的新请求,以m/n的概率选择保存,并同从已保存的m个请求中随机选出的一个进行交换。

比如这N个数为[4 2 6 8 10 3]要从中选m=4个数

a=[4 2 6 8 10 3];m=4;

b=a(randperm(length(a)));

b=b(1:m)

扩展资料:

c(n,m)=c(n-1,m-1)+c(n-1,m)

等式左边表示从n个元素中选取m个元素,而等式右边表示这一个过程的另一种实现方法:任意选择n中的某个备选元素为特殊元素,从n中选m个元素可以由此特殊元素的被包含与否分成两类情况,即m个被选择元素包含了特殊元素和m个被选择元素不包含该特殊元素。

前者相当于从n-1个元素中选出m-1个元素的组合,即c(n-1,m-1);后者相当于从n-1个元素中选出m个元素的组合,即c(n-1,m)。

参考资料来源:百度百科-组合数公式

从M个数中随机等可能的取出N个的问题

从0到m-1这m个数中随机取出n个(n<=m) 要求每个数被取到的可能性相等。 
第一个方法是把这m个数丢到一个List里面 然后用nextInt(list.size())来产生随机数 然后把list里面对应的元素丢到另一个数组或者list里面 这个方法本来是不错的 但要注意的是 为了保证每个元素取到的概率相等 需要每取出一个元素 就把它从list里面删除 原因就不解释了 简单的概率问题。但众所周知的是 list的remove(int index)方法 效率并不高 尤其是当m和n很大的时候 每一次调用remove ArrayList都需要进行数组的copy 而LinkedList需要进行链表的遍历。 
所以再考虑这个问题,用数组来储存这m个数是很好的 而且其实我们并不需要知道到底哪些下标的元素被选中了 第一个方法的效率低下的原因在于 nextInt(int i)这个方法是从0 到i-1随机生成整数 这里要求0到i-1是连续的i个整数 而我们选取了一个数之后 为了满足连续整数的条件 就要把这个数删去 而频繁删除的效率是低下的 所以换一种思路 不采用删除 而采用交换 

第二个方法 比如0-99这100个数字 从小到大放在一个数组里面 现在要选10个 我们只需要随机打乱这个数组 然后选取前10个元素就好 随机打乱的方法就是 从数组头元素开始 每次产生一个随机数n 然后交换这两个数 而且只需要交换十次就够了 因为我们并不取下标超过10后面的数字 

 

import java.util.Random;  
  
  
  
public class Rand {  
  
    public static void randSelect(int[] nums, int n) {  
        Random rand = new Random();  
        for(int i = 0; i < n; i ++){  
            swap(nums , i, rand.nextInt(nums.length-i)+i);  
        }  
    }  
      
    public static void swap(int[] nums, int m , int n){  
        int temp = nums[n];  
        nums[n] = nums[m];  
        nums[m] = temp;  
    }  
  
    public static void main(String[] args) {  
        int[] nums = new int[100];  
        for(int i = 0;i < 100;i++){  
            nums[i]=i;  
        }  
        randSelect(nums,10);  
        for(int i = 0;i < 10; i ++){  
            System.out.println(nums[i]);  
        }  
    }  
}  
  
/*output :&nbsp; 
27 
79 
30 
58 
41 
54 
75 
18 
26 
5 
*/  

 

以上是关于怎么从m个数中随机选择n个数的主要内容,如果未能解决你的问题,请参考以下文章

JAVA从数组中选取N个数,使其和为M实现算法?

MATLAB如何把n个数不重复地随机分为m组

从M个数中随机等可能的取出N个的问题

随机森林_理论

决策树(DecisionTree)和随机森林(Random Forests)

javascript小实例,编写一个方法,实现从n-m个数中随机选出一个整数