Some simple math isn't working in my helper - ruby-on-rails

I've got a grade function:
def grade(submission)
score_counter = 0
total_score = submission.test.questions.size
#the scoring logic is here
return (score_counter/total_score)*100
end
The intention is to return a percent score, but all that shows up in my view is 0. If I just try to return score_counter and total_score separately, they display the correct values. Any ideas?

You need to change your values to float
(score_counter.to_f / total_score.to_f) * 100

Related

In Google Sheets how can I randomize the order of a set of values?

Maybe I'm missing a keyword in my searches for a solution, but I didn't find what I'm looking for.
In Google Sheets I want to take a set of numbers and reorder it randomly. For example, start with the set [1,2,3,4] and get back [4,2,1,3].
Any ideas which function or a combination of functions may achieve this goal?
The entire process that I want to achieve is something like this:
I have a set of 4 fields. Their sum is fixed. I want to assign them randomized values.
So, I was thinking to iterate through this process:
Create a random integer between 0 and the max possible value (in the first iteration it's the fixed sum)
The new max value is the last max value minus the new random number.
Check if the new max is zero.
If not:
Return to the 1st step and repeat - This goes on until there are four values
If needed the 4th value shall be increased so the total will match the fixed sum.
Else, continue.
Randomize the order of the 4 values.
Assign the values to the 4 fields.
try:
=INDEX(SORT({{1; 2; 3; 4}, RANDARRAY(4, 1)}, 2, ),, 1)
or:
=INDEX(SORT({ROW(1:4), RANDARRAY(4, 1)}, 2, ),, 1)
Here are a couple of app script examples as well
function DiceRolls(nNumRolls) {
var anRolls = [];
nNumRolls = DefaultTo(nNumRolls, 1000)
for (var i = 1;i <= nNumRolls; i++) {
anRolls.push(parseInt((Math.random() * 6))+1);
}
return anRolls;
}
function CoinFlips(nNumFlips) {
var anFlips = [];
nNumFlips = DefaultTo(nNumFlips, 1000)
for (var i = 1;i <= nNumFlips; i++) {
anFlips.push(getRndInteger(1,2));
}
return anFlips;
}
function getRndInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1) ) + min;
}

Lua spawnpoint random

my problem is that he uses all 3 spawn points instead of only 1 of the 3 that I put there to choose from
YY_Pos = {}
YY_Pos[1] = {m=3017299663, x=1700, y=13154, z=2450}
YY_Pos[2] = {m=3017299663, x=1775, y=12413, z=2436}
YY_Pos[3] = {m=3017299663, x=1775, y=12413, z=2500}
function YY_tmhz_1_OnCreatureDisappear(MapID, InstanceID, Creatur ID, x, y, z)
for i = 1,3 do
local Index_pos = math.random(1,3)
local CreatureID = map.MapCreateCreature(YY_Pos[i].m, InstanceID, 1534207, YY_Pos[i].x, YY_Pos[i].y, YY_Pos[i].z)
end
end
You create a random value Index_pos but you never use it.
Instead you use the loop counter variable i to index your coordinate table.
Also note that the code as is will not use 1 of three coordinates but 3 random coordinates.
You would have to move the math.random call out of the loop if you want to do something 3 times for the same random index.

Can anyone explain how we will get the output of the following code in Lua?

function ReturnTwoVal()
return "1","2"
end
function ReturnThreeVals()
return "x","y","Z"
end
TblA = {ReturnThreeVals(),ReturnTwoVal() }
print(TblA[2],TblA[1], TblA[2], TblA[3], TblA[4])
Output will be: 1 x 1 2 nil
Expressions that return multiple values are adjusted to a single value, unless they are the last expression in a function call or table constructor.
Therefore,
TblA = {ReturnThreeVals(),ReturnTwoVal() }
is equivalent to
TblA = {"x", "1","2"}

Subtracting variables in Rails

Im trying to see if a point is within a circle.I am using the Pythagorean Theorem to check, but when I use this I get undefined method-' for "37.33259551999998":String`. How do I subtract these variables?
def getalerts
alerts = Alert.all
school = School.find_by_school_name(params[:school])
latitude = params[:latitude]
longitude = params[:longitude]
radius = school.radius
alertArray = Array.new()
alerts.each do |alert|
d = Math.sqrt(((alert.latitude - school.latitude)**2) + (alert.longitude - school.longitude)**2)
if d < radius
alertArray["latlng"] = alert.latitude, alert.longitude
end
end
respond_to do |format|
format.json { render json: alertArray}
end
end
Use to_f on alert and school latitudes and longitudes.
Converting to float will preserve decimal point numbers (unlike to_i)
d = Math.sqrt(
((alert.latitude.to_f - school.latitude.to_f)**2)
+ (alert.longitude.to_f - school.longitude.to_f)**2)
From the error message, it is clear that subtraction option is performed on strings and hence it is not valid. You can convert strings to integers using to_i method. So try this :
d = Math.sqrt(((alert.latitude.to_i - school.latitude.to_i)**2) + (alert.longitude.to_i - school.longitude.to_i)**2)
Also, if you want them converted to floating values, you will have to use to_f method.
Cary makes the correct point. Even if the initial question is about a technical problem with tying to subtract string representations of floating point numbers, the real issue is that you need to calculate the distance between two points on the earth. Here is a ruby implementation of the haversine formula
https://github.com/kristianmandrup/haversine/blob/master/lib/haversine.rb

How to setup the correct logic for picking a random item from a list based on item's rarity i.e "rare" "normal"

I'm writing a game using Corona SDK in lua language. I'm having a hard time coming up with a logic for a system like this;
I have different items. I want some items to have 1/1000 chance of being chosen (a unique item), I want some to have 1/10, some 2/10 etc.
I was thinking of populating a table and picking a random item. For example I'd add 100 of "X" item to the table and than 1 "Y" item. So by choosing randomly from [0,101] I kind of achieve what I want but I was wondering if there were any other ways of doing it.
items = {
Cat = { probability = 100/1000 }, -- i.e. 1/10
Dog = { probability = 200/1000 }, -- i.e. 2/10
Ant = { probability = 699/1000 },
Unicorn = { probability = 1/1000 },
}
function getRandomItem()
local p = math.random()
local cumulativeProbability = 0
for name, item in pairs(items) do
cumulativeProbability = cumulativeProbability + item.probability
if p <= cumulativeProbability then
return name, item
end
end
end
You want the probabilities to add up to 1. So if you increase the probability of an item (or add an item), you'll want to subtract from other items. That's why I wrote 1/10 as 100/1000: it's easier to see how things are distributed and to update them when you have a common denominator.
You can confirm you're getting the distribution you expect like this:
local count = { }
local iterations = 1000000
for i=1,iterations do
local name = getRandomItem()
count[name] = (count[name] or 0) + 1
end
for name, count in pairs(count) do
print(name, count/iterations)
end
I believe this answer is a lot easier to work with - albeit slightly slower in execution.
local chancesTbl = {
-- You can fill these with any non-negative integer you want
-- No need to make sure they sum up to anything specific
["a"] = 2,
["b"] = 1,
["c"] = 3
}
local function GetWeightedRandomKey()
local sum = 0
for _, chance in pairs(chancesTbl) do
sum = sum + chance
end
local rand = math.random(sum)
local winningKey
for key, chance in pairs(chancesTbl) do
winningKey = key
rand = rand - chance
if rand <= 0 then break end
end
return winningKey
end

Resources