|
2 registered members (AndrewAMD, Quad),
843
guests, and 1
spider. |
Key:
Admin,
Global Mod,
Mod
|
|
|
How to Program percentage influence
#472628
05/08/18 21:39
05/08/18 21:39
|
Joined: Aug 2005
Posts: 199 houston
seneca
OP
Member
|
OP
Member
Joined: Aug 2005
Posts: 199
houston
|
Just wondering if someone could help me figure out how to program a percentage influence.
I have 5 items that drop randomly. But I would like for one or two items to drop more frequently then some others.
been racking my brain for a couple of weeks and can't seem to write anything that makes sense or works like I want.
as always any help would be greatly appreciated.
a8 commercial
|
|
|
Re: How to Program percentage influence
[Re: seneca]
#472635
05/09/18 08:51
05/09/18 08:51
|
Joined: Jun 2007
Posts: 1,337 Hiporope and its pain
txesmi
Serious User
|
Serious User
Joined: Jun 2007
Posts: 1,337
Hiporope and its pain
|
Hi, for a uniform distribution of the members but one or two, encrease the limits of the range:
#define MEMBER_COUNT 5
#define LOWER_COUNT 2
//#define MIDDLE_COUNT 3 // MEMBER_COUNT - 2
//#define UPPER_COUNT 3
#define TOTAL_COUNT 8 // LOWER_COUNT + MIDDLE_COUNT + UPPER_COUNT
var itemID = clamp(floor(random(TOTAL_COUNT) - LOWER_COUNT), 0, MEMBER_COUNT - 1);
but when you call 'random' from many places in your code, the uniform distribution of random samples in a single place is lost so you need to build your own random sampler in order to mantain their uniformity. Maybe you are facing that. Here goes the random apply I adapted from somewhere someday: random_tail.h
#ifndef _RANDOM_TAIL_H_
#define _RANDOM_TAIL_H_
typedef struct {
long a;
long b;
} RANDOM_TAIL;
// Global random tail
void setRandomSeed (long _seed);
double getRandom (double _range);
double getRandom (); // 0<->1 range
// Custom random tail
RANDOM_TAIL *randomTailCreate (long _seed);
void randomTailRemove (RANDOM_TAIL *_rt);
void setRandomSeed (long _seed, RANDOM_TAIL *_rt);
double getRandom (double _range, RANDOM_TAIL *_rt);
#include "random_tail.c"
#endif
random_tail.c
RANDOM_TAIL randomTailGlobal;
void setRandomSeed (long _seed, RANDOM_TAIL *_rt) {
if (_seed) {
_rt->a = _rt->b = _seed;
} else {
_rt->a = _rt->b = (long)_rt + sys_hours + sys_minutes + sys_seconds + ~total_ticks; // pseudo random seed
if (_rt->a == 0)
_rt->a = 1;
}
}
void randomTailGlobal_startup () {
setRandomSeed (0, &randomTailGlobal);
}
void setRandomSeed (long _seed) {
setRandomSeed (_seed, &randomTailGlobal);
}
long getRandomLong (RANDOM_TAIL *_rt) {
_rt->a = 36969 * (_rt->a & 65535) + (_rt->a >> 16);
_rt->b = 18000 * (_rt->b & 65535) + (_rt->b >> 16);
return (_rt->a << 16) + _rt->b;
}
double getRandom (double _range, RANDOM_TAIL *_rt) {
double _d = getRandomLong ( _rt );
return ( _range * 0.5 ) + ( _d + 1.0 ) * _range * 2.328306435454494e-10;
}
double getRandom (double _range) {
return getRandom (_range, &randomTailGlobal);
}
double getRandom () {
return getRandom (1.0, &randomTailGlobal);
}
RANDOM_TAIL *randomTailCreate (long _seed) {
RANDOM_TAIL *_rt = sys_malloc (sizeof(RANDOM_TAIL));
setRandomSeed (_seed, _rt);
return _rt;
}
void randomTailRemove (RANDOM_TAIL *_rt) {
sys_free (_rt);
}
Salud!
|
|
|
Re: How to Program percentage influence
[Re: txesmi]
#472639
05/09/18 10:14
05/09/18 10:14
|
Joined: Aug 2005
Posts: 199 houston
seneca
OP
Member
|
OP
Member
Joined: Aug 2005
Posts: 199
houston
|
Oh, yeah! I think this will work for me. Great example to base from. Thank you. i was afraid i was gonna have to rewrite half my current code, but now i believe i can write a workaround that will not disrupt most of my code. Thanks again.
a8 commercial
|
|
|
Moderated by mk_1, Perro, rayp, Realspawn, Rei_Ayanami, rvL_eXile, Spirit, Superku, Tobias, TSG_Torsten, VeT
|
|
|