C中的rand(),模数从不触发

时间:2017-06-25 17:44:05

标签: c random fork simulation multiple-processes

我试图实现一个涉及同步的真实模拟,当我有一个有80%发生几率的事件时,我现在正在做

-p PID

然而,while循环在运行时从不触发,所以我不确定我是否正确使用rand()。如果我用7替换rand(),当它正常工作时。我目前正在设置

  while((rand()%10)<8){
    up(sCar);
    printf("SOUTH: new car\n");
  }

在我的计划中也是如此。任何帮助将不胜感激。

编辑:这是完整运行的程序。我修改了sys.c来创建up和down的系统调用,它们充当Semaphores。

  srand (time(NULL));

1 个答案:

答案 0 :(得分:0)

我总是使用这个公式来获得有偏见的rand()。我相信这比模数方法的分布更均匀。

#define RAND_PCT_THRESHOLD(x)  (int)(((long)(x) * RAND_MAX) / 100))

if (rand() <  RAND_PCT_THRESHOLD(80))
{
  // ...
)

你是什么意思

  

我修改了sys.c来创建up和down的系统调用,   充当信号量。

我认为这不是一个好主意。您确定没有比修改运行时库更简单,更安全的原子增量方法吗?你的错误可能来自那里,因为你发布的代码的逻辑确实看起来是正确的,如果你没有搞乱只读 - 除非那里有一个bug,它可能会运行正常-in-it 运行时库。

为您的信号量&#39;

分配内存时
 void * ptr = mmap(NULL, sizeof(struct cs1550_sem)*3, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, 0, 0);

当你明显需要4个信号量的空间时,你可以为3个信号量分配空间。

  struct cs1550_sem *nCar = ((struct cs1550_sem *)ptr);
  struct cs1550_sem *sCar = ((struct cs1550_sem *)ptr) + 1;
  struct cs1550_sem *mutex = ((struct cs1550_sem *)ptr) + 2;
  struct cs1550_sem *flag = ((struct cs1550_sem *)ptr) + 3;