[DGD] File access question
Mikael Lind
mikkelin at gmail.com
Sat Jul 14 00:23:10 CEST 2007
Hello Kurt,
The card game concept sounds interesting. Is this some sort of trading
card game? I have been thinking about using DGD to implement something
along those lines.
On 13/07/07, Kurt Nordstrom <kurt at blar.net> wrote:
> Is the loading of the entries something that I'd have to do with scheduled
> call outs to avoid a tick overflow? And is there any clever way to pick
> 200 random lines out of a variable length file?
Here is one way, not sure if it fits your idea of clever:
1. Count the number of entries.
2. Generate an array with integers ranging from 0 to count - 1.
3. Shuffle the array.
4. Use the 200 first elements as line indices.
Here is how to shuffle an array:
void swap_elements(mixed *arr, int i, int j)
{
mixed val;
val = arr[i];
arr[i] = arr[j];
arr[j] = val;
}
mixed *shuffle_array(mixed *arr)
{
int i, size;
arr = arr[..];
size = sizeof(arr);
for (i = 0; i < size; ++i) {
swap_elements(arr, i, i + random(size - i));
}
return arr;
}
Here is a unit test:
# define ASSERT(expr) if (!(expr)) error("Assertion failed: " + #expr)
void test_shuffle_array()
{
int *arr;
arr = ({ 13, 14, 15, 16, 17, 18, 19, 20, 21 });
ASSERT(sizeof(shuffle_array(arr) & arr) == sizeof(arr));
}
There are more clever ways of randomly selecting a fixed number of
entries from large data sets, but I am not sure on the details. The
above will probably solve your problem.
Regards,
Mikael
More information about the DGD
mailing list