= 怎样用 srand和rand 函数生成[30,80]的数呢? =

软件和网站开发以及相关技术探讨
回复
DRIFT
帖子: 177
注册时间: 2007-01-25 13:04

= 怎样用 srand和rand 函数生成[30,80]的数呢? =

#1

帖子 DRIFT » 2007-05-16 13:05

如题.
antonym55
帖子: 353
注册时间: 2007-04-03 9:52
联系:

#2

帖子 antonym55 » 2007-05-16 14:24

$man srand
$
我们可以看到里面举了一个例子, 1~10的随机数

代码: 全选

 j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
其中
(rand() / (RAND_MAX + 1.0)) 产生 0~1 之间的数字,

30~80 我们可以改成

代码: 全选

 j = 30 + (int) (50.0 * (rand() / (RAND_MAX + 1.0)));
注意:记得之前需要先调用一次srand(),另外,这么改不会产生80这个边界值(为什么?怎么改?自己想一下)
DRIFT
帖子: 177
注册时间: 2007-01-25 13:04

#3

帖子 DRIFT » 2007-05-16 21:18

强!
DRIFT
帖子: 177
注册时间: 2007-01-25 13:04

#4

帖子 DRIFT » 2007-05-16 21:35

大哥给看看这段代码那里错了.

代码: 全选

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

int
main ()
{
  char b;
  int c;
  initscr ();
  if (!hsa_colors () || start_cplor () == ERR)
    {
      endwin ();
      printf ("ERROR_DISABLE_COLOR\n");
      exit (1);
    }
  init_pair (1, COLOR_GREEN, COLOR_BLACK);
  init_pair (2, COLOR_RED, COLOR_BLACK);
  for (;;)
    {
      attron (COLOR_PAIR (1));
      srand ((int) time (0));
      c = 97 + (int) (26.0 * (rand () / (RAND_MAX + 1.0)));
      printw ("%c\n", c);
      refresh ();
      b = getch ();
      refresh ();
      if (c != b)
        {
          if (b == 27)
            {
              endwin ();
              exit (0);
            }
          else
            {
              attron (COLOR_PAIR (2));
              printw ("ERROR\n");
              refresh ();
            }
        }
    }
  return 0;
}
antonym55
帖子: 353
注册时间: 2007-04-03 9:52
联系:

#5

帖子 antonym55 » 2007-05-16 22:20

帮你改了
2处拼写错误, 少1个头文件

下次记得把编译命令行和错误提示一起给出来

代码: 全选

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

int main ()
{
    char b;
    int c;
    initscr ();
    if ( !has_colors () || start_color () == ERR )
    {
        endwin ();
        printf ( "ERROR_DISABLE_COLOR\n" );
        exit ( 1 );
    }
    init_pair ( 1, COLOR_GREEN, COLOR_BLACK );
    init_pair ( 2, COLOR_RED, COLOR_BLACK );
    for ( ;; )
    {
        attron ( COLOR_PAIR ( 1 ) );
        srand ( ( int ) time ( 0 ) );
        c = 97 + ( int ) ( 26.0 * ( rand () / ( RAND_MAX + 1.0 ) ) );
        printw ( "%c\n", c );
        refresh ();
        b = getch ();
        refresh ();
        if ( c != b )
        {
            if ( b == 27 )
            {
                endwin ();
                exit ( 0 );
            }
            else
            {
                attron ( COLOR_PAIR ( 2 ) );
                printw ( "ERROR\n" );
                refresh ();
            }
        }
    }
    return 0;
}
命令行参数

在Linux上编译Curses程序时,gcc要带 -lcurses参数,(这个是在IBM的网站上搜出来的)

我没用过curses,不知有什么书可以参考?
头像
efan
帖子: 238
注册时间: 2006-09-14 21:59
来自: 广东
联系:

#6

帖子 efan » 2007-05-16 22:35

antonym55 写了: j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
用得着这么麻烦吗……产生[A,B)之间的随机数,用
rand () % (B - A + 1) + A
就行了,没必要先转成[0,1)的
传说中的一凡……
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
联系:

#7

帖子 laborer » 2007-05-16 22:46

efan 写了:用得着这么麻烦吗……产生[A,B)之间的随机数,用
rand () % (B - A + 1) + A
就行了,没必要先转成[0,1)的
这样会导致随机数的概率不一致,特别是B-A大的时候,问题会比较明显。man srand有提到的。
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser
antonym55
帖子: 353
注册时间: 2007-04-03 9:52
联系:

#8

帖子 antonym55 » 2007-05-16 22:56

efan 写了:
antonym55 写了: j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
用得着这么麻烦吗……产生[A,B)之间的随机数,用
rand () % (B - A + 1) + A
就行了,没必要先转成[0,1)的
确实可以不用这么麻烦,完全可以用你说的这种方法,更可以自己写一个,

只不过 即然 The Art of Scientific Computing 中建议了

而且写到man手册中,还是用这个比较好点吧!
"If you want to generate a random integer between 1 and 10, you
should always do it by using high-order bits, as in

j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

and never by anything resembling

j = 1 + (rand() % 10);

(which uses lower-order bits)."
头像
shadowson
帖子: 65
注册时间: 2007-04-15 18:46

#9

帖子 shadowson » 2007-05-16 23:13

为什么我这样做了 但是产生的随机数全部为零?
antonym55
帖子: 353
注册时间: 2007-04-03 9:52
联系:

#10

帖子 antonym55 » 2007-05-16 23:44

shadowson 写了:为什么我这样做了 但是产生的随机数全部为零?
srand()你用什么做参数传进去的?

还是贴下代码吧!
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

#11

帖子 stlxv » 2007-05-17 1:03

:shock:
PHP是最好的语言!不服来战!
DRIFT
帖子: 177
注册时间: 2007-01-25 13:04

#12

帖子 DRIFT » 2007-05-17 12:49

antonym55 写了:帮你改了
2处拼写错误, 少1个头文件

下次记得把编译命令行和错误提示一起给出来

代码: 全选

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

int main ()
{
    char b;
    int c;
    initscr ();
    if ( !has_colors () || start_color () == ERR )
    {
        endwin ();
        printf ( "ERROR_DISABLE_COLOR\n" );
        exit ( 1 );
    }
    init_pair ( 1, COLOR_GREEN, COLOR_BLACK );
    init_pair ( 2, COLOR_RED, COLOR_BLACK );
    for ( ;; )
    {
        attron ( COLOR_PAIR ( 1 ) );
        srand ( ( int ) time ( 0 ) );
        c = 97 + ( int ) ( 26.0 * ( rand () / ( RAND_MAX + 1.0 ) ) );
        printw ( "%c\n", c );
        refresh ();
        b = getch ();
        refresh ();
        if ( c != b )
        {
            if ( b == 27 )
            {
                endwin ();
                exit ( 0 );
            }
            else
            {
                attron ( COLOR_PAIR ( 2 ) );
                printw ( "ERROR\n" );
                refresh ();
            }
        }
    }
    return 0;
}
命令行参数

在Linux上编译Curses程序时,gcc要带 -lcurses参数,(这个是在IBM的网站上搜出来的)

我没用过curses,不知有什么书可以参考?
后来我自己意识到少了time.h的头文件了. :oops:

谢谢你.
回复