Проблемы с Ruby Arrays - PullRequest
       1

Проблемы с Ruby Arrays

0 голосов
/ 19 января 2012

В настоящее время я пишу небольшой класс 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)

Ответы [ 2 ]

0 голосов
/ 19 января 2012

Вы слишком усердно работаете.Вы хотите, чтобы сохранял количество раз, когда случайно сгенерированное число было замечено в массиве, вместе со значением, которое видно само по себе .

Как Ruby может помочь вам в этом?Поскольку вы работаете с массивом, просмотрите доступные методы и, да, вот оно: count.

ar = [1,2,1,3,2,4,3,2,6,7,8,7]
rn = rand(10)
ar.count(rn)
0 голосов
/ 19 января 2012

Использование:

occurrences = Hash[ my_array.group_by{ |o| o }.map{ |o,a| [o,a.length] } ]

, чтобы получить хеш, отображающий каждое значение на количество раз, которое оно встречается. Чтобы вычислить это самостоятельно:

occurrences = Hash.new(0)
my_array.each{ |o| occurrences[o]+=1 }

См. документы , если вы не знаете, что делают эти методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...