原文
module test;
import std.stdio : writeln;
import std.range : iota, isForwardRange, hasSlicing, hasLength, isInfinite;
import std.array : array, Appender;
import std.random : Random, unpredictableSeed, dice, choice;
import std.algorithm : map, uniq, canFind;
@safe:
Random rnd;
static this()
{
rnd = Random(unpredictableSeed);
}
void main()
{
int recordsNeeded = 2;
int boolValuesNeeded = 3;
uint[] uniqueIDs;
makeUniqueIDs(uniqueIDs, recordsNeeded);
uint[][] tuples;
createBoolMatrix(tuples, recordsNeeded, boolValuesNeeded);
uint[][uint][] records = CreateTupleDictionary(uniqueIDs, tuples);
processRecords(records);
}
auto CreateTupleDictionary(ref uint[] ids, ref uint[][] tuples)
{
uint[][uint][] records;
foreach(i, id; ids)
records ~= [ ids[i] : tuples[i] ];
return records.dup;
}
void processRecords(T)(const ref T t) if (isForwardRange!T && hasSlicing!T && hasLength!T && !isInfinite!T)
{
t.writeln;
}
void createBoolMatrix(ref uint[][] m, size_t numberOfTuples, size_t numberOfBoolsInTuple)
{
m = iota(numberOfTuples)
.map!(i => iota(numberOfBoolsInTuple)
.map!(numberOfBoolsInTuple => cast(uint) rnd.dice(0.6, 1.4))
.array).array;
}
void makeUniqueIDs(ref uint[] arr, size_t sz)
{
arr.reserve(sz);
int[] a = iota(999_000_000, 1_000_000_000).array;
int i = 0;
uint x;
while(i != sz)
{
x = cast(uint)a.choice(rnd);
if (!arr.canFind(x))
{
arr ~= x;
i++;
}
}
}