Sometimes you want to generate data. Generating random data is pretty easy, but that doesn’t represent real user behavior. Real user behavior probably follows patterns. Here is an approach to generating some data that approximates stock price fluctuations.

The below algorithm will generate a string of code that can be input into Google charts for visualization here: https://code.google.com/apis/ajax/playground/?type=visualization#line_chart

# In order to generate a semi-realistic looking graph behavior # we use a sine function to generate periodic behavior(ups and downs). In order to avoid # a graph that is too regular, we introduce randomness at two levels: # The delta between steps across the x-axis is random, but within a range(deltavariance) # The wavelength of the sine function is varied by randomly incrementing the index we pass # to the sine function(sine_index) # CONFIGURATION VARIABLES yvalue = 1 # start value range = 100 # y-range deltavariance = 10 # allowable variance between changes sine_index, wavelength = 0, 0.33 #index into our sine function that determines whether we change direction or not i, maxi = 0, 100 # our counter and its maximum data = {sine_index => yvalue} # seed our data structure with its first value trend = :positive # :negative, :none # do we want the graph to trend upwards, downwards or neither periodmin, periodmax = 0, 0 # vars to enforce trending direction = 1 # start in a positive direction, -1 for negative # DO NOT EDIT BELOW THIS LINE while(i < maxi) olddirection = direction direction = Math.sin(sine_index).to_f direction = direction < 0 ? direction.floor : direction.ceil delta = rand(deltavariance) yvalue += delta * direction if trend == :positive yvalue = periodmin if yvalue < periodmin periodmin = yvalue if olddirection < direction elsif trend == :negative yvalue = periodmax if yvalue > periodmax periodmax = yvalue if olddirection > direction end data[sine_index] = yvalue sine_index += Math.sin(rand) # Math.sin(rand) will give random numbers from -1..1 i += 1 end code = <<-CODE function drawVisualization() { // Create and populate the data table. var data = google.visualization.arrayToDataTable([ ['x', 'Cats'], DATASTR ]); // Create and draw the visualization. new google.visualization.LineChart(document.getElementById('visualization')). draw(data, {curveType: "function", width: 500, height: 400, vAxis: {maxValue: 10}} ); } CODE datastr = data.collect{|k,v| "[#{k},#{v}]"}.join(",") code = code.gsub('DATASTR', datastr) puts code