2
\$\begingroup\$

I have an array of 1000 numbers, randomly generated. 10 of those numbers must be between 0-9 (including 0 and 9), and 10 of those numbers must be between 991 and 1000 (including 991 and 1000). This is what I came up with:

arr = []
980.times do
 arr << (11..989).to_a.sample
end
arr2 = []
10.times do 
 arr2 << rand(10)
end
arr3 = []
10.times do
 arr3 << (990..1000).to_a.sample
end
arr4 = []
arr4 = arr + arr2 + arr3
arr4.shuffle

Is there a more elegant way to do this in ruby?

asked Dec 11, 2013 at 5:51
\$\endgroup\$
1
  • \$\begingroup\$ Is it only 10 for ranges at the end or "at least 10"? \$\endgroup\$ Commented Dec 14, 2013 at 17:45

2 Answers 2

5
\$\begingroup\$

Some notes:

  • Try to learn some functional programming, you shouldn't write Ruby as it were a low-level language (like C). Favor expressions over statements. My 2-cents on the matter, I hope it helps: http://www.slideshare.net/tokland/functional-programming-with-ruby-9975242

  • Let me show a simple example of using FP. The first 4 lines of your code could be written like this: arr = 980.times.map { (11..989).to_a.sample }

  • arr4 = []: Why? the next line assigns it to another expression.

  • range.to_a.sample. That's very inefficient, better rand(range).

I'd write:

ranges = [0..9, 11..989, 990..1000]
output = ranges.flat_map do |range|
 range.map { rand(range) }
end.shuffle
answered Dec 11, 2013 at 9:03
\$\endgroup\$
2
  • \$\begingroup\$ I can't improve on your "I'd write:", but here's a variant: ranges.reduce([]) {|arr, range| arr + Array.new(range.size) {rand(range)}}.shuffle \$\endgroup\$ Commented Jan 8, 2014 at 7:54
  • \$\begingroup\$ @CarySwoveland: Not that efficiency is important here (those are small arrays), but note that reduce with + leads to O(n^2) code. \$\endgroup\$ Commented Jan 8, 2014 at 9:38
1
\$\begingroup\$

Be careful at the boundaries — you didn't implement what you wanted. The output will never contain 10, and it might include 990 among the [991, 1000] range.

answered Dec 11, 2013 at 9:27
\$\endgroup\$
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.