В настоящее время я пишу небольшой класс ruby, предназначенный для хранения количества раз, когда случайно сгенерированное число просматривается в массиве, вместе со значением, которое видно само.
Я пытаюсь сделать следующее, чтобы добавить значение вместе со временем по умолчанию, равным 1, в массив. Сценарий должен проверить, было ли значение включено в массив, и если это так, увеличить число раз, которое это значение было замечено, на 1
Однако я получаю повторяющиеся значения, что не должно происходить - поскольку код должен позволять сохранять значение только один раз, а если значение уже находится в массиве памяти, увеличить его на единицу.
Код приведен ниже, если кто-то может подсказать, что я делаю неправильно, это было бы здорово.
Приветствие
Martin
@memory = Array.new
def store(value)
foundflag = false
@memory.each do |array|
if value == array[0]
#Incrementing value timesseen
array[1] = array[1]+1
#Value found, changing found flag
foundflag = true
#Loop break
break
end
end
if foundflag != true then
@memory.push([value,1])
end
end
store(5)
Полный скрипт (неопрятный!)
class STAT
def initialize()
#STAT memory settings
@memory = Array.new
#Prediction settings
@predictions = 0
@sucessfulpredictions = 0
end
#STAT main functions
def store(value)
foundflag = false
@memory.each do |array|
if value == array[0]
#Incrementing value timesseen
array[1] = array[1]+1
#Value found, changing found flag
foundflag = true
#Loop break
break
end
end
if foundflag != true then
@memory.push([value,1])
end
end
def predict(nosimulations)
#Generate random value less than the total memory size
randomvalue = rand(total)+1
count = 0
@memory.each do |array|
value = array[0]
timesseen = array[1]
if randomvalue <= count + timesseen
puts "Predicted value #{value}"
end
count = count + array[1]
end
end
def simulate(nosimulations)
count = 1
while count <= nosimulations
#Generating a random number
randomnumber = rand(100)+1
#Storing the random number
store(randomnumber)
#Print simulation details#
puts "Running simulation #{count} of #{nosimulations}"
puts "Generated random number: #{randomnumber}"
#Incrementing count
count = count + 1
end
end
#STAT technical functions
def inspect()
#Print memory information message
puts "Memory information:"
@memory.each do |array|
value = array[0]
timesseen = array[1]
puts "Value #{value} - times seen: #{timesseen}/#{total}"
end
end
def total()
total = 0
@memory.each do |array|
total = total + array[1]
end
return total
end
#STAT load/save functions
def load(filename)
#Default engine to be loaded
enginename = "#{filename}.stat"
#Print checking for saved engine message
puts "Checking for saved memory file..."
#Checking for saved engine
if File.exists?(enginename)
#Print loading engine message
puts "Loading memory..."
@memory = Marshal.load File.read(enginename)
#Print engine loaded message
puts "Engine loaded"
else
#Print memory not found message
puts "Cannot load memory, no memory file found"
end
end
def save(filename)
#Default name for engine to be saved
enginename = "#{filename}.stat"
#Print saving engine message
puts "Saving memory..."
#Saving engine to specified file
serialized_array = Marshal.dump(@memory)
savefile = File.new(enginename,"w")
savefile.write(serialized_array)
savefile.close
#Print engine saved message
puts "Memory saved"
end
end
#STAT class test software
stat = STAT.new
filename = "test"
#Load
stat.load(filename)
#Simulate
stat.simulate(1000000)
#Testing
#stat.store(5)
#stat.store(5)
#Inspect
stat.inspect
#Predict
#stat.predict(1000000)
#Save
stat.save(filename)