You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby如何通过用户输入终止循环?附随机数生成循环问题求助

解决Ruby随机数生成循环无法停止的问题

嘿,作为Ruby新手遇到这个问题太正常啦!首先明确回答你:Ruby当然有break语句!不过你的代码问题不在有没有break,而是循环的逻辑设计出了问题,导致break根本没机会发挥作用😅

先帮你拆解下当前代码的核心问题:

  • 你一开始用gets.chomp阻塞程序等待输入,但输入后进入ran.each循环时,又在循环体里不断往ran数组添加新元素——这会导致each循环永远不会结束,因为数组一直在变长,遍历永远没尽头。
  • 整个程序没有在生成随机数的过程中监听用户的停止指令,用户根本没法触发终止操作。

修正后的实现方案

我们可以用多线程拆分任务:一个线程负责持续生成随机数,另一个线程(主线程)监听用户输入,一旦用户按下任意键(回车确认),就终止生成线程,最后计算并输出结果。代码如下:

def generate_random_numbers
  random_numbers = []
  puts "Press any key and hit Enter to stop the generation..."

  # 启动子线程负责生成随机数
  generator = Thread.new do
    loop do
      # 生成0到1之间的随机浮点数(如果需要到1.1可以改回1.1)
      num = Random.rand(0.0...1.0)
      random_numbers << num
      puts num
      sleep(1)
    end
  end

  # 主线程等待用户输入,输入后终止生成线程
  gets
  generator.kill
  generator.join # 确保生成线程完全停止

  # 计算并输出结果
  total_count = random_numbers.length
  average = total_count > 0 ? random_numbers.sum / total_count : 0.0

  puts "\nThe total number of random numbers generated is: #{total_count}"
  puts "The average of the random numbers is: #{average.round(4)}"
end

generate_random_numbers

关于Ruby的break语句

如果是普通的循环场景,break可以直接终止循环,比如:

count = 0
loop do
  count += 1
  puts "Count: #{count}"
  break if count == 5 # 当count等于5时终止循环
  sleep(1)
end

但你的场景需要响应用户的实时输入,单线程下gets会阻塞程序,导致随机数生成暂停,所以多线程是更合适的方案。

内容的提问来源于stack exchange,提问作者Renato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:44:54