Revert "Fix array:random() to return a random item using correct RNG logic,"
This reverts commit 68b34cf00b
.
This commit is contained in:
parent
8357d02992
commit
09204f4ce8
@ -13,7 +13,6 @@
|
||||
#include "array.h"
|
||||
#include "functions.h"
|
||||
#include "halfsiphash.h"
|
||||
#include "integers.h"
|
||||
#include "types.h"
|
||||
#include "util.h"
|
||||
|
||||
@ -161,7 +160,7 @@ public void Array$shuffle(array_t *arr, int64_t padded_item_size)
|
||||
|
||||
char tmp[padded_item_size];
|
||||
for (int64_t i = arr->length-1; i > 1; i--) {
|
||||
int64_t j = Int$random(0, i);
|
||||
int32_t j = arc4random_uniform(i+1);
|
||||
memcpy(tmp, arr->data + i*padded_item_size, padded_item_size);
|
||||
memcpy((void*)arr->data + i*padded_item_size, arr->data + j*padded_item_size, padded_item_size);
|
||||
memcpy((void*)arr->data + j*padded_item_size, tmp, padded_item_size);
|
||||
@ -172,7 +171,7 @@ public void *Array$random(array_t arr)
|
||||
{
|
||||
if (arr.length == 0)
|
||||
return NULL; // fail("Cannot get a random item from an empty array!");
|
||||
int64_t index = Int$random(0, arr.length-1);
|
||||
uint32_t index = arc4random_uniform(arr.length);
|
||||
return arr.data + arr.stride*index;
|
||||
}
|
||||
|
||||
@ -204,7 +203,7 @@ public array_t Array$sample(array_t arr, int64_t n, array_t weights, int64_t pad
|
||||
|
||||
if (total == 0.0) {
|
||||
for (int64_t i = 0; i < n; i++) {
|
||||
int64_t index = Int$random(0, arr.length-1);
|
||||
uint32_t index = arc4random_uniform(arr.length);
|
||||
memcpy(selected.data + i*padded_item_size, arr.data + arr.stride*index, padded_item_size);
|
||||
}
|
||||
} else {
|
||||
|
@ -60,7 +60,6 @@ void Array$sort(array_t *arr, closure_t comparison, int64_t padded_item_size);
|
||||
array_t Array$sorted(array_t arr, closure_t comparison, int64_t padded_item_size);
|
||||
void Array$shuffle(array_t *arr, int64_t padded_item_size);
|
||||
void *Array$random(array_t arr);
|
||||
#define Array$random_value(arr, t) ({ array_t _arr = arr; if (_arr.length == 0) fail("Cannot get a random value from an empty array!"); *(t*)Array$random(_arr); })
|
||||
array_t Array$sample(array_t arr, int64_t n, array_t weights, int64_t padded_item_size);
|
||||
void Array$clear(array_t *array);
|
||||
void Array$compact(array_t *arr, int64_t padded_item_size);
|
||||
|
@ -1864,7 +1864,7 @@ CORD compile(env_t *env, ast_t *ast)
|
||||
} else if (streq(call->name, "random")) {
|
||||
CORD self = compile_to_pointer_depth(env, call->self, 0, false);
|
||||
(void)compile_arguments(env, ast, NULL, call->args);
|
||||
return CORD_all("Array$random_value(", self, ", ", compile_type(item_t), ")");
|
||||
return CORD_all("Array$random(", self, ")");
|
||||
} else if (streq(call->name, "sample")) {
|
||||
CORD self = compile_to_pointer_depth(env, call->self, 0, false);
|
||||
arg_t *arg_spec = new(arg_t, .name="count", .type=Type(IntType, .bits=64),
|
||||
|
@ -667,7 +667,8 @@ type_t *get_type(env_t *env, ast_t *ast)
|
||||
else if (streq(call->name, "sort")) return Type(VoidType);
|
||||
else if (streq(call->name, "sorted")) return self_value_t;
|
||||
else if (streq(call->name, "shuffle")) return Type(VoidType);
|
||||
else if (streq(call->name, "random")) return Match(self_value_t, ArrayType)->item_type;
|
||||
else if (streq(call->name, "random"))
|
||||
return Type(PointerType, .pointed=Match(self_value_t, ArrayType)->item_type, .is_optional=true, .is_readonly=true);
|
||||
else if (streq(call->name, "sample")) return self_value_t;
|
||||
else if (streq(call->name, "clear")) return Type(VoidType);
|
||||
else if (streq(call->name, "from")) return self_value_t;
|
||||
|
Loading…
Reference in New Issue
Block a user