`

random select

 
阅读更多

 

random select

 

problem:

select m number from 0 - (n-1) randomly,

 

------

solution 1

 

for each number in 0 - (n-1), in increasing order, generate a random number x, using "(x%remain) < to_select" to decide will the number be choose,

until m number is choosen,

 

time:

o(n), when n is small, this is quick, but when n is very big, this will be very slow,

 

------

solution 2

 

use set to store choosen number, until enough,

 

time:

o(m*log(m))

space:

o(m)

 

disadvangate:

when n & m is quite closer, and n is big, this might be slow,

when m is big, will need a lot memory,

 

------

solution 3

 

init a n length array in increasing order,

mix the order of first m elements in original array,

then sort the first m elements,

then use the first m elements,

 

time:

o(n+m*log(m))

 

space:

o(n)

 

------

solution 4

 

base on solution 3,

don't init a n length array, only use a map to store first 5 m elements, and the elements that has been choose for swap with,

 

time:

o(m*log(m))

 

space:

o(m)

 

------

reverse select

 

if m*2 > n, we can choose to select n-m elements, and exclude them, the remain is m elements,

 

------

code:

 

 

/* @authur kuchaguangjie@gmail.com */
/**
 * problem:
 	select m number from 0 - (n-1) randomly,
 */ 
#include <stdio.h>
#include <stdlib.h>
/**
 * solution 1:
	for each number in 0 - (n-1), in increasing order, generate a random number x, 
	using "(x%remain) < to_select" to decide will the number be choose,until m number is choosen,
 * time:
 	O(n), when n is small, this is quick, but when n is very big, this will be very slow,
 */ 
void random_m_n(const int m, const int n) {
	int remain = n,to_select = m,i=0;
	while(to_select>0) {
		if(rand()%remain<to_select) {
			printf("%d,",i);
			to_select--;
		}
		remain--;
		i++;
	}
	printf("\n");
}
/**
 * swap 2 int value,by pointer,
 */
void swap(int *a,int *b) {
	int c = *a; 
	*a = *b; 
	*b = c;
}
/**
 * compare function for int
 */
int int_cmp(int *a,int *b) {
	return *a-*b;
}
/**
 * solution 2:
	init a n length array in increasing order,
	mix the order of first m elements in original array,
	then sort the first m elements,
	then use the first m elements,
 * time:
	o(n+m*log(m))
 * space:
 	o(n)
 */
void random_m_n_2(const int m, const int n) {
	int arr[n],i,swp,x;
	for(i=0;i<n;i++) {
		arr[i] = i;
	}
	for(i=0;i<m;i++) {
		x = rand()%n;
		swap(arr+i,arr+x);
	}
	qsort(arr,m,4,int_cmp);
	for(i=0;i<m;i++) {
		printf("%d,",arr[i]);
	}
	printf("\n");
}
int main(){
	random_m_n(30,2000);
	random_m_n(0,0);
	random_m_n(20,20);

	random_m_n_2(30,2000);
	random_m_n_2(0,0);
	random_m_n_2(20,20);
}
 

 

------

分享到:
评论

相关推荐

    3DMAX随机选择神器RandomSelect插件下载

    3DMAX随机选择神器RandomSelect插件,一键随机选择,支持对象、子对象(顶点、边、边界、多边形和元素)多种类型的随机选择。

    3dmax随机选择工具下载

    该插件名为"randomSelect",版本号为0.1.0。安装插件后,用户可以在3ds Max的命令面板中找到它。操作步骤如下: 1. **选择对象**:首先,你需要在3ds Max的工作视图中选择一组对象。这可以通过单击、框选或使用其他...

    random_select.rar

    "random_select.rar"是一个专为此目的设计的软件,它利用了Qt5.12框架和Visual Studio 2017(VS17)编译器,提供了简单易用的界面和功能,使得点名过程既高效又有趣。 Qt5是Qt开发框架的一个重要版本,由The Qt ...

    前端学习笔记,做一个简单的网站-设置下拉框中的默认随机选中项,学习代码

    &lt;select id="randomSelect"&gt; &lt;option value="option1"&gt;Option 1 &lt;option value="option2"&gt;Option 2 &lt;option value="option3"&gt;Option 3 &lt;!-- 更多选项... --&gt; &lt;/select&gt; ``` 接着,我们要实现随机选中项,需要...

    本Demo将演示一段随机挑选函数代码的性能升级之旅

    在提供的`RandomSelect`项目中,我们可以看到这些优化策略是如何被实现和测试的。`RandomSelect.sln`是Visual Studio解决方案文件,包含了源代码和项目配置。通过打开并运行这个项目,我们可以查看代码实现,学习...

    随机抽人点名软件,有没有什么随机点名软件,C#

    这个类可能包含方法如“随机选择”(RandomSelect),用于生成一个随机索引,对应名单中的一个名字。 接着,数据存储是一个关键问题。点名软件通常需要管理一个姓名列表。在C#中,我们可以使用数组、列表(List)...

    随即选题安装包

    其次,"RandomSelect.msi"是Microsoft Installer(MSI)文件,这是Windows平台上的一个标准安装包格式。MSI文件包含有关软件的元数据,如文件、注册表项、依赖关系等,以便系统能够自动化安装过程。"RandomSelect"很...

    随机抽签程序(delphi原程序经典)

    - 方法:`RandomSelect`: 实现随机选择获胜者的逻辑。 **第三方组件** 描述中提到的“第三方组件”,可能是为了增强用户界面或者提供特定功能。例如,`TOpenDialog`用于打开文件,让用户导入参与者的列表;`...

    神经网络导论课程实验1代码

    "randomselect.m"文件可能实现了数据集的随机选取功能,这对于训练和测试过程中的数据划分很重要。随机选择部分样本作为训练集,其余作为测试集,可以避免过拟合,并更准确地评估模型的泛化能力。 "data/lms_samp....

    DateToDoy_NC4Read_date_DOY_

    - "reflectance_randomselect.pro"可能是处理反射率数据的脚本,它可能包含了随机选择或采样数据集的逻辑,这对于处理大型遥感图像非常有用。 综上所述,这个程序包提供了从标准日期到DOY的转换工具,以及用于...

    FF(人物制作工具)

    这样设置,人物就会被移动到第8格了,很简单吧,对了,如果打上randomselect就有随机选人物的功能了, 加入背景的方法: 把背景的SFF和DEF文件放到stages里 同样打开data里select.def的文件,在 [Extrastages]...

    jQuery随手狂欢手机抽奖代码.zip

    例如,可能有一个startDraw()函数用于启动抽奖,一个stopDraw()函数用于停止并展示结果,以及一个randomSelect()函数用于生成随机中奖号码。 在实际运行中,jQuery的事件监听功能使得用户与页面的交互变得简单。...

    DBMS_RANDOM.VALUE OR DBMS_RANDOM.STRING

    SELECT ROUND(DBMS_RANDOM.VALUE(1, 100)) FROM DUAL; ``` 这里的`ROUND`函数用于将浮点数转换为整数。 `DBMS_RANDOM.STRING`函数则用于生成指定长度的随机字符串。它提供了两种模式,'P'(字母数字字符,小写优先...

    RandomListSelector:选择列表,然后从返回的列表中获取随机项目

    2. **随机选择**: 实现一个方法,例如`select(int n)`,它接受一个整数参数n,表示要从列表中选择的项目数量。这个方法将返回一个新的列表,其中包含了原始列表中随机选择的n个不重复的元素。 3. **种子设置**: ...

    VS2005C#编写的random算法的源代码

    .Select(s =&gt; s[random.Next(s.Length)]).ToArray()); } ``` 总的来说,`VS2005`中的C# `Random`类为开发者提供了简单而强大的随机数生成能力。通过理解其工作原理和使用方式,我们可以编写出更加灵活、高效的代码...

    BearyChatBotTools:BearyChat 机器人,提供一系列码农常用工具

    [count]返回 count 个范围为 min 到 max-1 的随机整数随机选择工具/t random select 兰州拉面 沙县小吃 黄山菜饭骨头汤...从空格分割的选项中随机选择一个UUID/t random uuid生成一个 v4 uuid/t random uuid 1生成一...

    dual虚表 select语法规则

    SELECT DBMS_RANDOM.VALUE FROM dual; ``` 这将返回一个随机数。 此外,DUAL虚表还可以用来获取序列号,例如: ```sql SELECT your_sequence.NEXTVAL FROM dual; ``` 这将返回下一个序列号。 在DUAL虚表中,我们还...

    feature selection by using random forest_RandomForest_python_特征选

    随机森林(Random Forest)是一种集成学习方法,常用于分类和回归任务,同时也广泛应用于特征选择。在本场景中,我们探讨的是如何利用Python中的RandomForest实现特征选择的过程。 首先,特征选择是机器学习预处理...

    Python实现返回数组中第i小元素的方法示例

    在提供的代码中,实现了一个名为`RandomSelect`的类,该类使用了快速选择算法(Quickselect),这是一种基于快速排序思想的算法,它可以在平均情况下达到线性时间复杂度。快速选择算法的核心在于分治策略,通过一次...

Global site tag (gtag.js) - Google Analytics