[R] Newbie to R: would like to solve a problem

McGehee, Robert Robert.McGehee at geodecapital.com
Fri May 12 22:15:41 CEST 2006


Not sure I completely followed (especially what a Knockback is), but
I'll give this a try.

If you want to precisely define the convolution of multiple attacks, you
would want to use a language that utilizes symbolic integration, which R
currently does not support (e.g. see Mathematica). That said, it sounds
like you don't actually want a precise answer, but you want to have a
"polynomial function estimate" the true distribution. If this is the
case, then it seems like doing a simulation may be precisely what you
want. That is, model a polynomial approximation of the total damage from
multiple attacks as a function of the number of attacks.

For instance the function below will plot what the distribution of N
multiple attacks would look like:

distributionFun <- function(N, min, max, skill, num_attacks) {
	hist(replicate(1000, sum(replicate(N, total_damage(min, max,
skill, num_attacks)))))
}

and
sum(replicate(N, total_damage(min, max, skill, num_attacks)))
will give you a sample from this distribution.

Thus, distributionFun(1, 10, 20, 1, 1) will show the piecewise constant
distribution that you would expect from a single attack, and setting N
to a large number produces a Gaussian distribution (CLT). [NB: Here the
N and num_attacks arguments may be redundant, but it's not clear to me
how these multiple attacks work (i.e. are there multiple attacks
multiple times, etc.)]

Once you have the simulated distribution, you can either create a
polynomial model as a function of N and use these values as inputs into
your web simulation, or you can use the code above to grab a single
sample from the distribution. Also, I imagine you would get better
results modeling the moments of the distribution (mean, variance, skew,
kurtosis, etc.) rather than using a polynomial function, but up to you.

Also, if you're only doing this for the first 8 attacks, then
integrating a piecewise constant function by hand (if Mathematica is
unavailable) is not too difficult, and running simulations may be going
overboard.

Lastly, just as an FYI, your functions can be rewritten a bit more
concisely as such:

sdmg <- function(min, max, skill) {
     runif(1, min, max) * ifelse(runif(1) > 0.4, skill, skill + 1)
}

total_damage <- function(min, max, skill, num_attacks) {
	sum(replicate(num_attacks, sdmg(min, max, skill))
}

Good luck,
Robert

-----Original Message-----
From: r-help-bounces at stat.math.ethz.ch
[mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of percy tiglao
Sent: Friday, May 12, 2006 2:08 PM
To: r-help at stat.math.ethz.ch
Subject: [R] Newbie to R: would like to solve a problem

Hello, I am very new to R (read the introduction a few hours ago), but
experianced in several other languages (including Scheme, C, ObjC and
C++, Java and Javascript) and I was wondering how to approach this
problem:

I am making a training calculator for a Video Game I play. Basically,
I want to calculate the probability of killing an enemy within x hits,
to help determine which is the best monster to train on in this game.

The current implementation
(http://geocities.com/dragontamer5788/maple2.html) uses the normal
curve to estimate just about everything. Not necessarily a bad idea
for when it takes 10 or 15 hits to destroy a single enemy, Central
Limit Theorm kicks in and normal curve is probably a good idea, but my
gut feeling is that it is not accurate for estimating kills in 1 or 2
shots (which happens in the majority of "training" monsters), or the
probability of Knockback (which is always determined by a single
shot).

The (simplified) function to represent the damage would be:

sdmg <- function(min, max, skill){
  if(runif(1) > .4) (runif(1) * (max-min) + min) * skill
  else (runif(1) * (max-min) +  min) * (skill+1)
}

total_damage <- function(min, max, skill, num_attacks){
  total <- 0
  for(i in 1:num_attacks){
    total <- total + sdmg(min, max, skill)
  }
  total
}

--------------------

The above is how damage is calculated. So the probability distribution
looks like 2 rectangles next to each other, one with height .6 and the
other with height .4. Sdmg is a helper function, because some attacks
attack 2 or 4 times in a single turn.

Though, I dont want the simulation (what I'm doing with the runif
here). I'd like to calculate the probability distribution of
total_damage, total_damage + total damage (the convolution,
representing 2 hits), and so on till about 5-8 hits (then I can just
use normal curve in the web-calculator I'm making), then have a
polynomial function estimate the probability distributions based on
min, max, and skill. (So I can make my online calculator estimate the
probability of killing enemies)

Erm, I know it is a lot to ask for, but how would I go about making
this in R? And if R isn't the right tool for this, is there any other
tool you'd reccomend? Cause doing convolutions by hand sucks.

Thanks a lot for reading this long message :) And thanks in advance
for your help.

______________________________________________
R-help at stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide!
http://www.R-project.org/posting-guide.html




More information about the R-help mailing list