随机圆内坐标


import java.util.Random;

import com.alibaba.fastjson.JSON;
import com.game.json.FastJSONserializable;

/**
 * 随机圆内坐标
 * 
 * @author zs
 * @time 2018年11月7日
 * @Description
 */
public class RandomCirPos {
	// 圆心坐标
	static int cirx = 0;
	static int ciry = 0;
	// 半径
	static int circleR = 5000;
	static Random random = new Random();
	static double r2 = Math.pow(circleR, 2);
	// 随机点坐标
	static int[] pos = new int[2];

	public static int[] getxy() {
		// 取xy距离圆心的距离
		int x = random.nextInt(2 * circleR) + 1 - circleR;
		int y = random.nextInt(2 * circleR) + 1 - circleR;
		// 获取x整数坐标
		if (r2 < Math.pow(x, 2) + Math.pow(y, 2)) {
			//理论上不用再次计算的概率为3.14/4
			pos = getxy();
		} else {
			pos[0] = cirx + x;
			pos[1] = ciry + y;
		}
		return pos;
	}

	public static void main(String[] args) {
		long t1 = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			getxy();
		}
		long t2 = System.currentTimeMillis();
		System.out.println("T1 " + (t2 - t1));
		for (int i = 0; i < 100000; i++) {
			getxy2();
		}
		long t3 = System.currentTimeMillis();
		System.out.println("T2 " + (t3 - t2));
	}

	// 上面这个方法和下面这个方法相比,耗时差不多的
	public static int[] getxy2() {
		// 取xy距离圆心的距离
		int x = random.nextInt(2 * circleR) + 1 - circleR;
		int yh = (int) Math.sqrt((r2 - Math.pow(x, 2)));
		int y = 0;
		if (yh != 0) {
			y = random.nextInt(yh) + 1 - yh;
		}
		pos[0] = cirx + x;
		pos[1] = ciry + y;
		return pos;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值