BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / iwhisper / #7678380同步于 2024/10/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
IWhisper机器人发帖

如何在[-10, 10]的区间中,生成N(N<21)个间距不小于1的随机实数

IWhisper#610
2024/10/10镜像同步19 回复
本来想发别的版面的,但是感觉没有悄悄话看的人多,所以只能发在这里了
订阅后,新回复会通过你的通知中心匿名送达。
19 条回复
IWhisper#610机器人#0 · 2024/10/10
如何编写算法,使得在[-10, 10]的区间中,生成N(N&lt;21)个间距不小于1的随机实数?<br><br>最近科研遇到的问题,需要用这个算法生成大量的这种数组。自己想的几种算法效率太低,尤其是在N非常接近21的时候算法效率很低。<br>去知乎上问了,没人回答。没处去了,所以只能问问大伙儿了。<br><br>北邮的算法大佬们,救一下啊!<br><img src="/img/ubb/ema/23.gif" alt="ema23" style="display:inline;border-style:none"><img src="/img/ubb/ema/23.gif" alt="ema23" style="display:inline;border-style:none"><img src="/img/ubb/ema/23.gif" alt="ema23" style="display:inline;border-style:none"><img src="/img/ubb/ema/23.gif" alt="ema23" style="display:inline;border-style:none"><img src="/img/ubb/ema/23.gif" alt="ema23" style="display:inline;border-style:none">
IWhisper#610机器人#1 · 2024/10/10
本来想发别的版面的,但是感觉没有悄悄话看的人多,所以只能发在这里了
IWhisper#886机器人#2 · 2024/10/10
我有个想法,不一定对。每次先计算最小的数的范围,在这个范围内随机生成一个数,然后计算第二小的数的范围,以此类推
IWhisper#657机器人#3 · 2024/10/10
bd,只能想到让步进为不小于1的实数
IWhisper#886机器人#4 · 2024/10/10
比如你想生成19个数,那么最小的数只能在[-10,-8],在这个范围内生成一个数x,然后问题转化为在[x+1,10]之间随机生成18个数
IWhisper#165机器人#5 · 2024/10/10
先从-10开始按照步长1放N个数,再把剩下的长度随机分成N+1份插入到间隙中?
IWhisper#886机器人#6 · 2024/10/10
问题在于,这样还能不能保证随机性,或者说这样的随机和你问题描述的随机是不是等价的
IWhisper#610机器人#7 · 2024/10/10
感谢,虽然这样生成的数确实不一定是“均匀随机”,但现阶段应该是够用了。最主要是这样的程序好写。<br>【 在 IWhisper#886 的大作中提到: 】<br><font class="f006">: 比如你想生成19个数,那么最小的数只能在[-10,-8],在这个范围内生成一个数x,然后问题转化为在[x+1,10]之间随机生成18个数 </font>
IWhisper#850机器人#8 · 2024/10/10
gpt一下
IWhisper#850机器人#9 · 2024/10/10
要生成一个算法,实现在区间[-10, 10]内生成N(N&lt;21)个间距不小于1的随机实数,可以采用以下Python实现方法。这个方法首先随机选择一个起始点,然后以至少1的步长递增地选择后续点,确保它们之间的间距满足条件。<br><br>```python<br>import random<br><br>def generate_random_numbers(N):<br>&nbsp;&nbsp;&nbsp;&nbsp;if N &lt; 1 or N &gt; 20:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise ValueError("N must be between 1 and 20 inclusive.")<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;numbers = [-10 + random.random()]&nbsp;&nbsp;# Start with a random number in [-10, -9]<br>&nbsp;&nbsp;&nbsp;&nbsp;while len(numbers) &lt; N:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Generate a candidate next number ensuring the gap is at least 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_num = numbers[-1] + random.uniform(1, 2)&nbsp;&nbsp;# Ensure a gap of at least 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Adjust if the new number goes beyond the upper limit<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if next_num &gt; 10:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_num = 10 - (10 - next_num) % 2 + (random.randint(0, 1) * 2 - 1) * ((10 - next_num) % 2)&nbsp;&nbsp;# Ensure it stays within bounds and maintains min gap<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numbers.append(next_num)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Shuffle to avoid any pattern due to sequential generation<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;random.shuffle(numbers)<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;return sorted(numbers)&nbsp;&nbsp;# Return sorted list to maintain order<br><br># Example usage<br>N = 10<br>random_numbers = generate_random_numbers(N)<br>print(random_numbers)<br>```<br><br>这个算法首先检查输入的N是否在允许的范围内。然后,它从[-10, -9)之间开始随机选择第一个数,确保不会一开始就超出范围。之后,通过在当前最大值基础上加上至少1但不超过2的随机增量来尝试选择下一个数(这样可以确保间距至少为1),同时处理可能超过上界10的情况,通过取模和随机正负调整确保最后一个数字也能落在范围内。最后,为了消除由于顺序生成可能导致的任何潜在模式,对生成的数字列表进行了随机洗牌,并在返回前进行排序,以保持结果的有序性。<br><br>请注意,因为加入了随机洗牌的步骤,最终序列中的数字不再保持原始生成时的递增顺序,而是随机分布在[-10, 10]区间内,且两两间至少相距1。
IWhisper#610机器人#10 · 2024/10/10
这种方法有点像画网格,然后在每个格子里找随机数。但这种办法生成的随机数还是不够“随机”,有点太“均匀”太“规矩”了,而实际中生成的数有些时候更“偏向一边”。<br>【 在 IWhisper#165 的大作中提到: 】<br><font class="f006">: 先从-10开始按照步长1放N个数,再把剩下的长度随机分成N+1份插入到间隙中? </font>
IWhisper#886机器人#11 · 2024/10/10
目前大二,概率论这块还没太学明白<img src="/img/ubb/ema/23.gif" alt="ema23" style="display:inline;border-style:none"><br>【 在 IWhisper#610 的大作中提到: 】<br><font class="f006">: 感谢,虽然这样生成的数确实不一定是“均匀随机”,但现阶段应该是够用了。最主要是这样的程序好写。 </font><br>:
IWhisper#481机器人#12 · 2024/10/10
可以是回溯算法吗?<img src="/img/ubb/ema/12.gif" alt="ema12" style="display:inline;border-style:none">
IWhisper#610机器人#13 · 2024/10/10
<br>【 在 IWhisper#850 的大作中提到: 】<br><font class="f006">: 要生成一个算法,实现在区间[-10, 10]内生成N(N&lt;21)个间距不小于1的随机实数,可以采用以下Python实现方法。这个方法首先随机选择一个起始点,然后以至少1的步长递增地选择后续点,确保它们之间的间距满足条件。 </font><br><font class="f006">: ```python </font><br><font class="f006">: import random </font><br><font class="f006">: ................... </font><br><br>跟楼上#886的思路差不多。<br>不过也是怪了,我拿这个问题问GPT,他就没给我这个方法。<br>
IWhisper#610机器人#14 · 2024/10/10
可以,只要足够高效就行。不过现阶段楼上#886的思路够我用了。<br>【 在 IWhisper#481 的大作中提到: 】<br><font class="f006">: 可以是回溯算法吗?<img src="/img/ubb/ema/12.gif" alt="ema12" style="display:inline;border-style:none"> </font>
IWhisper#610机器人#15 · 2024/10/10
因为你是从最小值开始入手往大取的,所以你这个思路生成的数组应该是比较靠“左”的,也就是更倾向于靠近-10一侧。如果是从最大值开始往小取,这样生成的数组会比较靠“右”。不过现阶段我就先这么写了,等之后看别的大佬提出新的想法来再说吧。<br>【 在 IWhisper#886 的大作中提到: 】<br><font class="f006">: 目前大二,概率论这块还没太学明白<img src="/img/ubb/ema/23.gif" alt="ema23" style="display:inline;border-style:none"> </font>
IWhisper#647机器人#16 · 2024/10/10
找只猴子,高告诉它需求,让它随机写不就行了。
IWhisper#633机器人#17 · 2024/10/10
随机取值后取整操作,然后用set数据结构存。set大小增加,那这个数就可取,直到存够N个数
IWhisper#467机器人#18 · 2024/10/10
找个研究生来也行<br>【 在 IWhisper#647 的大作中提到: 】<br><font class="f006">: 找只猴子,高告诉它需求,让它随机写不就行了。 </font><br>: