【发布时间】:2022-11-10 22:44:57
【问题描述】:
我正在处理一个很长的数字列表,比如 15 亿。我需要一种方法来指定我想保留的数字的百分比,其余的丢弃。现在我知道我可以使用随机数生成器来随机决定是否应该保留它,但问题是我需要保留/丢弃的数字始终相同。这意味着,如果我运行程序并决定丢弃索引 2、5 和 10,那么下次我运行程序时,它也必须丢弃 2、5 和 10。这个非常重要。
我也面临记忆问题。为了生成一个巨大的布尔列表来确定哪些数字被丢弃,哪些不是(例如,如果我们决定这样做),分析器说程序使用了大约 15gb 的内存,考虑到我还没有,这已经太多了另一个包含 15 亿个数字的列表。如果这很重要,这是我的代码:
static bool[] GenerateShouldAddList(int totalCombos, decimal percentToAdd)
{
Random RNG = new Random();
bool[] bools = new bool[totalCombos];
int percent = (int)(percentToAdd * 100);
for (int i = 0; i < totalCombos; i++)
{
int randNum = RNG.Next(0, 101);
bools[i] = randNum < percent;
}
return bools;
}
所以我在想,为了避免列出一个庞大的列表,有没有办法制作一个函数来接收索引号(比如索引 5364)、总数(15 亿)和你想要保留的百分比,然后返回给我是否应该添加该特定索引?如果我通过该函数一次运行每个索引,我应该只剩下我指定的数字百分比。最重要的是,这个函数应该总是为相同的索引返回相同的结果(如果 totalNumbers 和百分比没有改变)。我认为这是不可能的,但我也希望这里有人比我聪明得多。任何帮助表示赞赏!
【问题讨论】:
-
尝试使用随机种子,例如
Random RNG = new Random(12345);它将生成随机但重复的序列 -
尝试水库取样,在这种情况下您不必将整个数组加载到内存中,枚举就足够了:en.wikipedia.org/wiki/Reservoir_sampling