⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 random.c

📁 这是一个C的源代码
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <gmp.h>#include "pbc_random.h"#include "pbc_utils.h"#include "pbc_memory.h"static void deterministic_mpz_random(mpz_t z, mpz_t limit, void *data){    static gmp_randstate_t rs;    static int rs_is_ready;    UNUSED_VAR (data);    if (!rs_is_ready) {	gmp_randinit_default(rs);	rs_is_ready = 1;    }    mpz_urandomm(z, rs, limit);}static void file_mpz_random(mpz_t r, mpz_t limit, void *data)//TODO: generate some kind of warning on error{    char *filename = (char *) data;    FILE *fp;    int n, bytecount, leftover;    unsigned char *bytes;    mpz_t z;    mpz_init(z);    fp = fopen(filename, "rb");    if (!fp) return;    n = mpz_sizeinbase(limit, 2);    bytecount = (n + 7) / 8;    leftover = n % 8;    bytes = (unsigned char *) pbc_malloc(bytecount);    for (;;) {	fread(bytes, 1, bytecount, fp);	if (leftover) {	    *bytes = *bytes % (1 << leftover);	}	mpz_import(z, bytecount, 1, 1, 0, 0, bytes);	if (mpz_cmp(z, limit) < 0) break;    }    fclose(fp);    mpz_set(r, z);    mpz_clear(z);    pbc_free(bytes);}static void (*current_mpz_random)(mpz_t, mpz_t, void *) = deterministic_mpz_random;static void *current_random_data;static int trydevrandom = 1;void pbc_mpz_random(mpz_t z, mpz_t limit){    if (trydevrandom) {	FILE *fp;	fp = fopen("/dev/urandom", "rb");	if (!fp) {	    fprintf(stderr, "Warning: could not open /dev/urandom, using deterministic random number generator\n");	} else {	    random_set_file("/dev/urandom");	    fclose(fp);	}	trydevrandom = 0;    }    current_mpz_random(z, limit, current_random_data);}void pbc_mpz_randomb(mpz_t z, unsigned int bits){    mpz_t limit;    mpz_init(limit);    mpz_setbit(limit, bits);    pbc_mpz_random(z, limit);    mpz_clear(limit);}void random_set_deterministic(void){    trydevrandom = 0;    current_mpz_random = deterministic_mpz_random;    current_random_data = NULL;}void random_set_file(char *filename){    trydevrandom = 0;    current_mpz_random = file_mpz_random;    current_random_data = filename;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -