http://www.1point3acres.com/bbs/thread-176388-1-1.html
you have 1 meter walkroad, and randomly generate rain, the rain is 1 cm. simulate how many rain drops to cover all the 1 meter [-0.01~1].
用merge intervals
https://moonstonelin.wordpress.com/2016/05/26/simulate-rain-in-1-meter-side-walk/
you have 1 meter walkroad, and randomly generate rain, the rain is 1 cm. simulate how many rain drops to cover all the 1 meter [-0.01~1].
用merge intervals
- static class Interval {
 - double left = 0, right = 0.01;
 - boolean isWet() {
 - return left >= right;
 - }. 1point 3acres 璁哄潧
 - }
 - public static void main(String[] args) {
 - simulateRainDrop();
 - }
 - public static void simulateRainDrop() {
 - . visit 1point3acres.com for more.
 - Interval[] sidewalk = new Interval[100];
 - for (int i = 0; i < 100; i++) {. 1point 3acres 璁哄潧
 - sidewalk[i] = new Interval();
 - }
 - int cnt = 0, wetCnt = 0;
 - while (wetCnt < 100) {. 鍥磋鎴戜滑@1point 3 acres
 - ++cnt;
 - double p = Math.random();
 - double left = p - 0.005;
 - double right = p + 0.005;
 - if (left >= 0) {
 - int idx = (int) (left / 0.01);
 - if (!sidewalk[idx].isWet()) {
 - double iright = left - idx * 0.01;
 - if (iright < sidewalk[idx].right) {. 1point 3acres 璁哄潧
 - sidewalk[idx].right = iright;
 - if (sidewalk[idx].isWet())
 - ++wetCnt;
 - }. 涓€浜�-涓夊垎-鍦帮紝鐙鍙戝竷
 - }. from: 1point3acres.com/bbs
 - }
 - if (right <= 1) {
 - int idx = (int) (right / 0.01);
 - if (!sidewalk[idx].isWet()) {
 - double ileft = right - idx * 0.01;
 - if (ileft > sidewalk[idx].left) {
 - sidewalk[idx].left = ileft;
 - if (sidewalk[idx].isWet())
 - ++wetCnt;
 - }.鏈枃鍘熷垱鑷�1point3acres璁哄潧
 - }
 - }
 - }
 - System.out.println(cnt);. more info on 1point3acres.com
 - }
 - }
 
| 定义一个 struct interv { double left=0, right=0.01; bool isWet() { return left>=right; } }; 就好了,然后生成0,1之间的一个均匀分布,模拟每个雨滴看落到哪个interval里,直. Waral 鍗氬鏈夋洿澶氭枃绔�, 到100个都打湿。 vector<interv> sidewalk(100,interv()); int cnt=0, wetCnt=0, idx; while(wetCnt<100) { ++cnt; double p= (double)(rand())/RAND_MAX; double left=p-0.005; double right=p+0.005; if(left>=0) {. 1point3acres.com/bbs idx=left/0.01; if(!sidewalk[idx].isWet()) { iright=left-idx*0.01; if (iright<sidewalk[idx].right) { sidewalk[idx].right=iright; if(sidewalk[idx].wet()) ++wetCnt; } } } if(right<=1) {. 鍥磋鎴戜滑@1point 3 acres idx=right/0.01; if(!sidewalk[idx].wet()) { ileft=right-idx*0.01;. From 1point 3acres bbs if (ileft>sidewalk[idx].left) { sidewalk[idx].left=ileft; if(sidewalk[idx].isWet()) ++wetCnt; } } } }  | 
https://moonstonelin.wordpress.com/2016/05/26/simulate-rain-in-1-meter-side-walk/
    public void SimulateRainDrop()    {        SideWalk sideWalk = new SideWalk(100);        while (!sideWalk.HasOccupied())        {            Random random = new Random();            double start = random.Next(101) - 1 + random.NextDouble();            double end = start + 1;            sideWalk.DropRain(start, end);            Console.Write(start);            Console.Write(" , ");            Console.Write(end);            Console.Write("\n");        }        Console.WriteLine("occupied!");    }//start is the distance to 0, end is the distance to 1//both start and end fall into [0, 1]public class Interval{    public double Start { get; set; }    public double End { get; set; }    public bool IsCovered { get; set; }    public Interval()    {        this.Start = 0;        this.End = 0;        this.IsCovered = false;    }}public class SideWalk{    private int curOccupiedCount;    public int Count;    public Interval[] Intervals;    public SideWalk(int count)    {        this.curOccupiedCount = 0;        this.Count = count;        this.Intervals = new Interval[count];        for (int i = 0; i < this.Count; i++)        {            this.Intervals[i] = new Interval();        }    }    // 1.68..2.68    public void DropRain(double start, double end)    {        int index = (int)Math.Floor(start);        if (index >= 0)        {            if (Math.Abs(start - index) < 0.00001)            {                if (!this.Intervals[index].IsCovered)                {                    this.curOccupiedCount++;                    this.Intervals[index].IsCovered = true;                }                return;            }            if (!this.Intervals[index].IsCovered)            {                this.Intervals[index].End = Math.Max(this.Intervals[index].End, index + 1 - start);                if (this.Intervals[index].Start + this.Intervals[index].End >= 1)                {                    this.Intervals[index].IsCovered = true;                    this.curOccupiedCount++;                }            }        }        if (index + 1 < this.Count)        {            if (!this.Intervals[index + 1].IsCovered)            {                this.Intervals[index + 1].Start = Math.Max(this.Intervals[index + 1].Start, end - index - 1);                if (this.Intervals[index + 1].Start + this.Intervals[index + 1].End >= 1)                {                    this.Intervals[index + 1].IsCovered = true;                    this.curOccupiedCount++;                }            }        }    }    public bool HasOccupied()    {        return this.curOccupiedCount == this.Count;    }    }