/* Copyright (C) 2017 Apoorv Mishra This file is part of FLINT. FLINT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. See . */ #include #include "flint.h" #include "ulong_extras.h" int main(void) { ulong limit, rand_num; slong deviation; int i, j, result; int * count; int * count_in_subrange; FLINT_TEST_INIT(state); flint_printf("n_urandint...."); fflush(stdout); /* Test for limit <= 1000 */ count = flint_malloc(sizeof(int) * 1000); for (limit = 1; limit <= 1000; limit+=10) { for (i = 0; i < limit; i++) { count[i] = 0; } for (i = 0; i < 1000 * flint_test_multiplier(); i++) { rand_num = n_urandint(state, limit); count[rand_num]++; } result = 1; for (i = 0; i < limit; i++) { deviation = count[i] - (1000 * flint_test_multiplier())/limit; if (deviation >= WORD(100) * flint_test_multiplier() || deviation <= WORD(-100) * flint_test_multiplier()) { result = 0; break; } } if (!result) { flint_printf("FAIL:\n"); flint_printf("limit = %wu, deviation = %wd\n", limit, deviation); flint_free(count); abort(); } } flint_free(count); /* Test for larger values of limit */ count_in_subrange = flint_malloc(sizeof(int) * 4); for (i = 0; i < 1000; i+=10) { for (j = 0; j < 4; j++) { count_in_subrange[j] = 0; } limit = UWORD_MAX/(i + 2)*(i + 1); for (j = 0; j < 1000 * flint_test_multiplier(); j++) { rand_num = n_urandint(state, limit); if (rand_num >= 3*(limit >> 2)) { count_in_subrange[3]++; } else if (rand_num >= 2*(limit >> 2)) { count_in_subrange[2]++; } else if (rand_num >= (limit >> 2)) { count_in_subrange[1]++; } else { count_in_subrange[0]++; } } result = 1; for (j = 0; j < 4; j++) { deviation = count_in_subrange[j] - ((1000 * flint_test_multiplier()) >> 2); if (deviation >= WORD(100) * flint_test_multiplier() || deviation <= WORD(-100) * flint_test_multiplier()) { result = 0; break; } } if (!result) { flint_printf("FAIL:\n"); flint_printf("limit = %wu, deviation = %wd\n", limit, deviation); flint_free(count_in_subrange); abort(); } } flint_free(count_in_subrange); FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }