Mrs. Kwan
2021-05-12T10:06:43+00:00
如题。
举个例子,已知我仓库里一个月出了3000件物品b。
如何伪造一个日出库数据。
[a1,a2]就是日出库数据的区间,不显得太假。
n就是这个月的天数30。
你用excel的随机数不行么??
我错了,没看清楚居然和值要B,我试试先。。
直接取n-1个满足你要求的随机数 然后最后一个用b减去原随机数的和就得到你要的数列
如果只有两种的话而和是固定的话,你就取一个随机,另一个用和去减不就好了
你这个就是如何生成一系列随机数使得和为0
这不是很简单吗,先随机生成0-1的随机数,然后减0.5
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]认真的?
第一天在0和b之间取随机a1(怕第一个制太大就在0和b/2之间取),第二天就在0和b-a1之间取,以此类推,最后一天就是b-sum(a1,a2,...an-1)
[quote][pid=517593973,26836042,1]Reply[/pid] Post by [uid=40822731]苏珞[/uid] (2021-05-20 18:19):
直接取n-1个满足你要求的随机数 然后最后一个用b减去原随机数的和就得到你要的数列[/quote]这个对的,抢红包的基础原理
[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,而且数据量小的时候可能差距很大
生成29次随机数,每次上限为3000减已生成随机数列的和,最后一个为剩下的3000-29个随机数和
[quote][pid=517593973,26836042,1]Reply[/pid] Post by [uid=40822731]苏珞[/uid] (2021-05-20 18:19):
直接取n-1个满足你要求的随机数 然后最后一个用b减去原随机数的和就得到你要的数列[/quote]n-1个的和可能就大于b了
你发30块钱红包30个人领,按时间顺序排起来就行了
[quote][pid=517594664,26836042,1]Reply[/pid] Post by [uid=1463561]战士不reroll[/uid] (2021-05-20 18:22):
认真的?[/quote]最后一个数用0去减啊…
[quote][pid=517595195,26836042,1]Reply[/pid] Post by [uid=38787715]Ajiangt L[/uid] (2021-05-20 18:24):
这样不能保证和为0,而且数据量小的时候可能差距很大[/quote]……最后一个数要用0去减的
如果要显得不假,首先是了解日出库的数量大约是多少,然后随机生成波动值。
一列生成随机数,求和
和与你的期望对比,大了N,就从前N个数里各减一
#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] << " ";
}
[quote][pid=517595761,26836042,1]Reply[/pid] Post by [uid=36647]de_cctv[/uid] (2021-05-20 18:26):
如果要显得不假,首先是了解日出库的数量大约是多少,然后随机生成波动值。[/quote]a1,a2这个区间就是为了看起来不假。
比如一般日出库会在100到400间浮动。