JAVA 两个简单的抽奖算法

不多说了,代码不多,算法也简单

方法一:

/**
	 * 获取中奖号的算法,方法会在每次抽到一个中奖号后,将最后一个号码填充到此位置,实现不重复抽取.
	 * <p>
	 * 经过多次测试,此方法在大数据时速度略优于{@link #booleans()},小数据时差距可忽略
	 *
	 * @return
	 */
	public int[] deleteLast(){
		if(prize <= 0) return new int[0];

		int[] nums = new int[max];
		for(int i=0; i<max; i++){
			nums[i] = i+1;
		}

		int[] prizes = new int[prize];
		int zj = 0;
		for(int i=0; i<prize; i++){
			zj = (int) (Math.random() * max);
			prizes[i] = nums[zj];
			nums[zj] = nums[--max];
		}
		return prizes;
	}

方法二:

/**
	 * 获取中奖号的算法,方法设置原始数组的值为boolean型,抽中过将值设为true,实现不重复抽取.
	 * <p>
	 * 经过多次测试,此方法在大数据时速度略差于{@link #deleteLast()},小数据时差距可忽略
	 *
	 * @return
	 */
	public int[] booleans(){
		if(prize <= 0) return new int[0];

		boolean[] nums = new boolean[max];
		for(int i=0; i<max; i++){
			nums[i] = false;
		}

		int[] prizes = new int[prize];
		int zjCount = 0;
		int zj = 0;
		while(zjCount < prize){
			zj = (int) (Math.random() * max);
			if(!nums[zj]){
				nums[zj] = true;
				prizes[zjCount++] = zj;
			}
		}
		return prizes;
	}

借鉴:http://bbs.csdn.net/topics/280080151

时间: 2024-11-06 07:43:30

JAVA 两个简单的抽奖算法的相关文章

java版根据权重抽奖算法

根据权重进行抽取的算法应用比较广泛,其中抽奖便是主要用途之一.正好这几天也正在进行抽奖模块的开发,整个抽奖模块涉及到的地方大概有三处,分别是后台进行奖品的添加(同时设置权重和数量),前台根据后台配置生成抽奖队列并根据指令开始抽奖活动,最后一部分是后台统计中奖情况并设置物流状态.本文主要针对前台抽奖算法进行介绍如何根据权重设置每个奖品被抽到的概率. 抽奖算法的核心是根据权重设置随机数出现的概率,在此我将它封装成一个生成随机数的随机类,代码如下: /** * JAVA 返回随机数,并根据概率.比率

Java 多线程编程两个简单的例子

/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<10;i++){ System.out.println("新线程输出:"+i); } } public static void main(String []

java 程序执行输出有两种简单方式

java 程序执行输出有两种简单方式: 1. System.out.println("需要输出的内容"): 该方法可参看运行一个简单的Java程序 结果图: 2. System.out.print("需要输出的内容"): 1 public class HelloWorld 2 { 3 //Java程序的入口方法,程序将从这里开始运行 4 public static void main(String[] args) 5 { 6 //向控制台打印一条语句 7 Syste

两种常用的全排列算法(java)

问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"."52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0.2都不行,5可以,将5和2交换得到"956

Java 多线程编程两个简单的样例

/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<10;i++){ System.out.println("新线程输出:"+i); } } public static void main(String []

java单向加密算法小结(1)--Base64算法

java单向加密算法小结(1)--Base64算法 从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始. 简单了解 Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式. 我们都知道,数据在计算机网络之间是使用字节流的方式进行传递的,所有的信息都要最终转换为0101的二进制,这本身就涉及到编码,解码的应用. Base64,顾名思义,是使用了64个基本的字符来对任意数据进行编码的一种实现方式,那既然有Base64,是不是也有Base32,Base16

java的几种经典排序算法

排序算法大致有直接插入排序.折半插入排序.Shell排序.归并排序.直接选择排序.堆排序.冒泡排序.快速排序.桶式排序.基数排序等这些种,各个算法都有其优异性,大家不妨自己看看.下面贴上每个算法的简单讲解和实现: 1.直接选择排序(DirectSelectSort):其关键就是对n个数据要进行n-1趟比较,每趟比较的目的就是选择出本趟比较中最小的数据,并将选择出的数据放在本趟中的第一位.实现如下: [java] view plaincopy <span style="font-size:1

Java 理论与实践: 非阻塞算法简介--转载

在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情.Java 语言中主要的同步手段就是synchronized 关键字(也称为内在锁),它强制实行互斥,确保执行 synchronized 块的线程的动作,能够被后来执行受相同锁保护的synchronized 块的其他线程看到.在使用得当的时候,内在锁可以让程序做到线程安全,但是在使用锁定保护短的代码路径,而且线程频繁地争用锁的时候,锁定可能成为相当繁重的操作. 在 “流行的原子” 一文中,我们研究了原子

Java的多线程 简单入门

Java的多线程 简单入门 首先可以先搞清楚什么是程序.进程.线程,以及它们之间的关系: 定义: 一 程序只是一组指令的有序集合,它是静态的 二 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位: 三 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程: 进程与线程区别与联系 (