2011-04-19 109 views
1

我需要一种方法用C即十进制65-90 [a - z]之间的随机数和小数97-122 [A - Z]返回。如果我调用这个方法,那么这个方法必须是一个不同的数字,回馈他先前给出的方法。我如何在C中执行此操作?随机数或者65- 90 [AZ]或97-122 [AZ]

+1

作业?没问题,只要告诉我们。 – pmg 2011-04-19 21:02:37

+0

这是作业的一部分 – marco 2011-04-19 21:04:30

回答

2
#include <stdlib.h> 

char rand_az_AZ() { 
    char val = rand() % 52; 
    if (val < 26) { 
     val += 'a'; 
    } else { 
     val -= 26; 
     val += 'A'; 
    } 
    return val; 
} 
+0

thx ...更新! – 2011-04-19 21:08:51

+1

哇这是不可思议的这就是我需要感谢你soooooo太多 – marco 2011-04-19 21:09:59

+0

关于这个例子的一个更多的问题我如何修复它,当我连续调用programm树时间,他给了我不同的数字? – marco 2011-04-19 21:15:33

1

给定一个功能random_in_range,在范围[0,n)返回随机整数:

char random_letter() 
{ 
    static const char letters[] = "abcdefghijlkmnopqrstuvwxyz" 
            "ABCDEFGHIJLKMNOPQRSTUVWXYZ"; 
    return letters[random_in_range(sizeof(letters))]; 
} 

(A简单实现的random_in_range(n)将返回rand() % n这将不会返回均匀分布的整数,虽然)。

+0

我麻烦做rand()和srand() – marco 2011-04-19 21:05:24

2

你可以做一个0到52之间的随机数(不包括52)吗?

做到了!将65添加到结果中。如果值为91或更大,则在第二个结果中加6。 Voilà!

喔......如果数量是一样的,从上次一个(你在一个静态变量保存的最后一个数字,不是吗?),再做一次:)

0

UPDATE 2

根据Interjay的评论再次更新。

UPDATE

每Interjay的评论所做的更改。还改变了pickChar,以便我们不依赖于特定的编码。

警告:不建议使用%操作符将rand的结果映射到不同的范围。不保证低位模式的均匀分布,并且可以得到非正态分布的值。它适用于班级任务,但下面的程序应该会给出更好的结果:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int randInRange(int min, int max) 
{ 
    return (int)(((double) rand()/(double)(RAND_MAX + 1)) * (max - min + 1)) + min; 
} 

char pickChar(void) 
{ 
    char val; 
    int cas = randInRange(0, 1); 

    if (cas == 1) 
    val = (char) randInRange('A', 'Z'); 
    else 
    val = (char) randInRange('a', 'z'); 

    return val; 
} 

int main(void) 
{ 
    char results[11] = {0}; 
    int i; 

    srand(time(NULL)); // seed the random number generator 

    for (i = 0; i < sizeof results - 1; i++) 
    results[i] = pickChar(); 

    printf("Random string: %s\n", results); 
    return 0; 
} 
+0

如果rand()返回了RAND_MAX,那么'randInRange'函数可以给出一个超过'max'的值。 – interjay 2011-04-20 15:01:30

+0

实际上,它仍然是越野车:现在'max'几乎不会被返回。这应该起作用:'(int)(((double)rand()/((double)RAND_MAX + 1))*(max-min + 1))+ min'。 – interjay 2011-04-20 17:03:28

相关问题