aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/WeighedRandom.cpp
blob: 8839b0c55fb59b73d45553babc390b07249853cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "stdafx.h"
#include "WeighedRandom.h"

int WeighedRandom::getTotalWeight(vector<WeighedRandomItem *> *items)
{
    int totalWeight = 0;
	for( AUTO_VAR(it, items->begin()); it != items->end(); it++ )
	{
		totalWeight += (*it)->randomWeight;
	}
    return totalWeight;
}

WeighedRandomItem *WeighedRandom::getRandomItem(Random *random, vector<WeighedRandomItem *> *items, int totalWeight)
{
    if (totalWeight <= 0)
	{
        __debugbreak();
    }

	int selection = random->nextInt(totalWeight);

	for( AUTO_VAR(it, items->begin()); it != items->end(); it++ )
	{
		selection -= (*it)->randomWeight;
        if (selection < 0)
		{
            return *it;
        }
	}
    return NULL;
}

WeighedRandomItem *WeighedRandom::getRandomItem(Random *random, vector<WeighedRandomItem *> *items)
{
	return getRandomItem(random, items, getTotalWeight(items));
}

int WeighedRandom::getTotalWeight(WeighedRandomItemArray items)
{
    int totalWeight = 0;
	for( unsigned int i = 0; i < items.length; i++ )
	{
        totalWeight += items[i]->randomWeight;
    }
    return totalWeight;
}

WeighedRandomItem *WeighedRandom::getRandomItem(Random *random, WeighedRandomItemArray items, int totalWeight)
{
    if (totalWeight <= 0)
	{
        __debugbreak();
    }

    int selection = random->nextInt(totalWeight);
	for( unsigned int i = 0; i < items.length; i++ )
	{
		selection -= items[i]->randomWeight;
        if (selection < 0)
		{
            return items[i];
        }
	}
    return NULL;
}


WeighedRandomItem *WeighedRandom::getRandomItem(Random *random, WeighedRandomItemArray items)
{
	return getRandomItem(random, items, getTotalWeight(items));
}