我知道有很多关于随机数的问题,但我试图在区间[0,k]中创建一个生成CMD
个数字的代码。这个数字可以重复,但我不想重复相同的数字,例如:
对于[0,10]中的5个数字,我不想要:Windows
。
对于[0,10]中的10个数字,我不想要:n
。
对于[0,10]中的5个数字,我想要类似:1 1 3 3 3
。
对于[0,10]中的5个数字,我想要类似:1 3 3 3 3 4 4 4 8 8
。
好的,这不难做到,我这样做了:
0 2 3 3 4
问题是,我想以升序和降序生成这些数字。我试图通过以下方式来实现:
0 0 1 2 4 5 5 5 7 10
此代码将生成随机数,有时会重复数字,这就是我想要的。但是,如果static void random_numbers(unsigned int n)
{
unsigned int i, interval;
interval = 1000000;
srand((unsigned int) time(NULL));
for(i = 0; i < n; i++)
{
printf("%u\n", (unsigned int) rand() % (interval + 1));
}
}
为100,则可以生成最大数字900.我还没有找到一种方法来设置间隔。
我想方向但不好,使用static void ascending(unsigned int n)
{
unsigned int i, acc;
srand((unsigned int) time(NULL));
for(i = 0, acc = 0; i < n; i++)
{
acc += (unsigned int) rand() % 10; /* For descending, just change + to - */
printf("%u\n", acc);
}
}
函数生成数字,将它们存储在数组中并对它们进行排序(升序或降序)以及打印后,但这需要时间和内存。
此代码的目的是生成用于测试排序算法的数据。我不想下载DataSet,我想创建自己的函数。这些数字将打印在n
上,并使用linux上的重定向,我将它们存储在一个文件中。
感谢。
答案 0 :(得分:0)
// Try this.
static void ascending(unsigned int n, int gap) {
int i, ofs, rnum;
ofs = 0; // ofs at 0
srandom((int) time(NULL));
for (i = 0; i < n; i++, ofs += gap) { // up the ofs by gap.
rnum = ofs + rand() % gap;
printf("%d\n", rnum);
}
}
int main(int argc, char **argv) {
int n, gap;
n = atoi(argv[1]);
gap = atoi(argv[2]);
ascending(20, 11);
}
答案 1 :(得分:0)
不是直接在一个操作中进行,而是分解为两个:
所以,像这样:
#include <stdlib.h>
#include <stdio.h>
static int compare_asc(const void * uint1, const void * uint2)
{
return (*(const unsigned int *) uint1) -
(*(const unsigned int *) uint2);
}
static int compare_desc(const void * uint1, const void * uint2)
{
return compare_asc(uint2, uint1);
}
unsigned int * random_range(unsigned int n, unsigned int k)
{
int i;
unsigned int * range= malloc(sizeof(unsigned int) * n);
if (range) {
for(i = 0; i < n; ++i) {
range[i] = rand() % k;
}
}
return range;
}
unsigned int * random_ascending(unsigned int n, unsigned int k)
{
unsigned int * range = random_range(n, k);
if(range) {
qsort(range, n, sizeof(unsigned int), compare_asc);
}
return range;
}
// implementing random_descending(n,k) is left as exercise ...
int main(int argc, char*argv[])
{
unsigned int k = 22, n = 42, i;
unsigned int * range;
srand((unsigned int) time(NULL));
range = random_ascending(n, k);
if(range) {
for(i = 0; i < n; ++i) {
printf("range[%d] = %d\n", i, range[i]);
}
free(range); // need to free
return 0;
}
else {
printf("Unable to allocate necessary memory...\n");
return 1;
}
}