[作业自己做系列] 有大佬吗? 如何生成n个[a1,a2]范围内,和为b的随机数列?

Mrs. Kwan-avatar

Mrs. Kwan

2021-05-12T10:06:43+00:00

如题。

举个例子,已知我仓库里一个月出了3000件物品b。
如何伪造一个日出库数据。
[a1,a2]就是日出库数据的区间,不显得太假。
n就是这个月的天数30。
WilzDaBeast-avatar

WilzDaBeast

懂得怎么取随机数么?随机数乘以区间大小就是了
Shahriar-avatar

Shahriar

你用excel的随机数不行么??

我错了,没看清楚居然和值要B,我试试先。。
SlongDongMan-avatar

SlongDongMan

硬算吧,你这还要取整,
Smurda-avatar

Smurda

直接取n-1个满足你要求的随机数 然后最后一个用b减去原随机数的和就得到你要的数列
JMEEE-avatar

JMEEE

如果只有两种的话而和是固定的话,你就取一个随机,另一个用和去减不就好了
Sxmsonite-avatar

Sxmsonite

你这个就是如何生成一系列随机数使得和为0
这不是很简单吗,先随机生成0-1的随机数,然后减0.5
GLaDOS The floof🐺🇳🇱(furry)-avatar

GLaDOS The floof🐺🇳🇱(furry)

[quote][pid=517594337,26836042,1]Reply[/pid] Post by [uid=42911814]deadlywalk2[/uid] (2021-05-20 18:20):

你这个就是如何生成一系列随机数使得和为0
这不是很简单吗,先随机生成0-1的随机数,然后减0.5[/quote]认真的?
SwarmR0-avatar

SwarmR0

第一天在0和b之间取随机a1(怕第一个制太大就在0和b/2之间取),第二天就在0和b-a1之间取,以此类推,最后一天就是b-sum(a1,a2,...an-1)
Samvěd-avatar

Samvěd

[quote][pid=517593973,26836042,1]Reply[/pid] Post by [uid=40822731]苏珞[/uid] (2021-05-20 18:19):
直接取n-1个满足你要求的随机数 然后最后一个用b减去原随机数的和就得到你要的数列[/quote]这个对的,抢红包的基础原理
SwarmR0-avatar

SwarmR0

[quote][pid=517594337,26836042,1]Reply[/pid] Post by [uid=42911814]deadlywalk2[/uid] (2021-05-20 18:20):

你这个就是如何生成一系列随机数使得和为0
这不是很简单吗,先随机生成0-1的随机数,然后减0.5[/quote]这样不能保证和为0,而且数据量小的时候可能差距很大
eliboi-avatar

eliboi

生成29次随机数,每次上限为3000减已生成随机数列的和,最后一个为剩下的3000-29个随机数和
SwarmR0-avatar

SwarmR0

[quote][pid=517593973,26836042,1]Reply[/pid] Post by [uid=40822731]苏珞[/uid] (2021-05-20 18:19):

直接取n-1个满足你要求的随机数 然后最后一个用b减去原随机数的和就得到你要的数列[/quote]n-1个的和可能就大于b了
RuClipZz-avatar

RuClipZz

你发30块钱红包30个人领,按时间顺序排起来就行了
Sxmsonite-avatar

Sxmsonite

[quote][pid=517594664,26836042,1]Reply[/pid] Post by [uid=1463561]战士不reroll[/uid] (2021-05-20 18:22):

认真的?[/quote]最后一个数用0去减啊…
Sxmsonite-avatar

Sxmsonite

[quote][pid=517595195,26836042,1]Reply[/pid] Post by [uid=38787715]Ajiangt L[/uid] (2021-05-20 18:24):

这样不能保证和为0,而且数据量小的时候可能差距很大[/quote]……最后一个数要用0去减的
Yme-avatar

Yme

如果要显得不假,首先是了解日出库的数量大约是多少,然后随机生成波动值。
Jaced-avatar

Jaced

一列生成随机数,求和

和与你的期望对比,大了N,就从前N个数里各减一
$aw.C Mystic-avatar

$aw.C Mystic

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <stdio.h>
#include <sys/time.h>
#include <random>
using namespace std;

long getTimeNs()
{
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);

return ts.tv_sec * 1000000000 + ts.tv_nsec;
}
default_random_engine e;

int a[100000];
int main()
{
e.seed(getTimeNs());
int a1, a2, b, n;
cin >> a1 >> a2 >> b >> n;
uniform_int_distribution<int> N(1, 30);

for (int i = 1; i <= n; i++)
{
int l = max(a1, b - (n - i) * a2);
int r = min(a2, b - (n - i) * a1);
uniform_int_distribution<int> N(l, r);

a[i] = N(e);
b -= a[i];
}

for (int i = 1; i <= n; i++)
cout << a[i] << " ";
}
Mrs. Kwan-avatar

Mrs. Kwan

[quote][pid=517595761,26836042,1]Reply[/pid] Post by [uid=36647]de_cctv[/uid] (2021-05-20 18:26):

如果要显得不假,首先是了解日出库的数量大约是多少,然后随机生成波动值。[/quote]a1,a2这个区间就是为了看起来不假。
比如一般日出库会在100到400间浮动。