algorithm - 向数组添加或减去随机数以使数字的差值不超过 8 的算法
问题描述
可以从以下一组数字 {-8,-4,0,4,8} 中随机添加一系列 16 个数字,但考虑到新生成的系列不应该有任何两个数字相差8以上。
我正在尝试一种有效的算法,它可以生成一组数字,应该在不违反约束的情况下添加这些数字。
解决方案
如果您可以使用连续范围,则问题会稍微容易一些。这是一个在 Ruby 中被大量评论的实现:
# Note that generating from the set {-8, -4, 0, 4, 8} is equivalent to
# generating integers in the range -2..2 and scaling by 4. Working with
# contiguous ranges is easier, just upscale before using or printing.
MAX_DELTA = 8 / 4 # specified maximum difference between any pair of values in scaled range
N = 16 # number of values to generate
data = [] # start with an empty array
data << rand(-2..2) # generate first (anchor) value in rescaled range
(N - 1).times do # generate remaining N-1 values by...
range_min, range_max = data.minmax # finding min & max of current set
# determine new range based on the current range + absolute constraints
new_range_min = [range_max - MAX_DELTA, -2].max
new_range_max = [range_min + MAX_DELTA, 2].min
# generate and store new value
data << rand(new_range_min..new_range_max)
end
# remap results to actual desired range
data.map! { |i| 4 * i }
# print results separated by commas.
puts data.join(', ')
这会产生如下输出:
4, -4, -4, 4, -4, 4, 0, 0, -4, -4, -4, 0, 0, 4, 4, -4
或者
4, 8, 8, 8, 8, 4, 4, 4, 0, 4, 8, 0, 0, 0, 4, 0
推荐阅读
- google-sheets - 使用嵌套给出解析错误的简单公式
- php - 如何从table1中获取值,在table2中搜索,找到后-获取第一个值的行值?
- unity3d - Unity Kin 插件 - 错误请求
- javascript - 我想通过在反应中按回车键在文本区域框中创建新的“li”
- linux - 移动未使用的文件并保留目录结构
- java - 如何在向 WEB 用户发送 FCM 通知时设置 ttl(生存时间)?
- android - 错误:无法解析“:Aware@debug/compileClasspath”的依赖关系:无法解析项目:aars
- java - 在 SLF4J 中构建自定义记录器的最简单方法是什么?
- c# - PDFSharp 支持哪些加密?
- arrays - 在左旋或右旋中,这些方向的约定是从哪里来的?