Страница 1 из 2

Random

Добавлено: 21 янв 2006, 20:25
constab
Как заставить при помощи команды Random выводить случайные числа в диапазоне.
Диапазон в принципе не важен.
Числа получаются случайные если выывать random несколько раз подрят.
Неужели нельзя сделать чтобы всегда независимо от количества вызовов random-а выводились разные числа.

Добавлено: 21 янв 2006, 20:36
Gnida
Если я понял правильно то
cat /dev/urandom и дергаем мышкой

Добавлено: 21 янв 2006, 22:01
exe
constab, Что за команда? в шелле или языке программирования?

если в C, то используй srandom()/srand для установки начального
значения псевдо-генератора.

Самый распространенный способ - srand(time());

Добавлено: 22 янв 2006, 15:10
constab
exe, да это все те злостные времена программирования на Delphi под Windows.
Там было все просто:
randomize;
random(10);
И получаешь случайное число от 0 до 9.

Да srand вещь!

Только вот у меня два вопроса:
1) Есть ли в си функция microtime, так как time обнавляет свое значение очень редко.
2) Что-то у меня не получается передать значение рандома от одой функции к другой

Код: Выделить всё

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

int rnd(int max);

int main(){

	int i;

	for(i=1;i<10;i++){
		rnd(i);
		printf("%d\n",rnd);
	}

} 

int rnd(int max){

	int x;

	srand(time(NULL));
	x=rand()%max;
	printf("%d\t", x);

	return x;

}
И вот что получается на выходе...

Код: Выделить всё

[constab@localhost qwe]$ cc q.c
[constab@localhost qwe]$ ./a.out
0       134513761
0       134513761
2       134513761
0       134513761
4       134513761
2       134513761
1       134513761
0       134513761
5       134513761
[constab@localhost qwe]$

Добавлено: 22 янв 2006, 16:52
michael
Не извращайся. Инициализация генератора srand(time(NULL)) делается только один раз, а не перед каждым вызовом rand. Если тебе нужны более случайные числа, делай как говорит Gnida.

Добавлено: 22 янв 2006, 23:12
bazil
Опять. Что вы пишите!? Кому и зачем это надо. Как вы пишите?

Код: Выделить всё

int rnd(int max){ 

   int x; 

   srand(time(NULL)); 
   x=rand()%max;
   return x; 

}

int main(){ 

   int i; 

   for(i=1;i<10;i++)      
      printf("%d\n",rnd(i));

} 
Опять же это не юникс вэй

Добавлено: 25 янв 2006, 15:21
constab
Да, мне аж самому стало не приятно, когда увидел, что за бред я написал

Код: Выделить всё

      rnd(i);
      printf("%d\n",rnd); 
:shock:

Добавлено: 26 янв 2006, 04:46
red f0x
Может так?

Код: Выделить всё

static int __rnd (int rmax)
{
        return (rand () % rmax) + 1;
}

int rnd (int rmax )
{
        return (__rnd (rmax) + __rnd (rmax) + __rnd (rmax) + __rnd (rmax) +
                __rnd (rmax) + __rnd (rmax) + __rnd (rmax) + __rnd (rmax) ) / 8;
}
Без маниакального srand() :D

Добавлено: 26 янв 2006, 12:44
constab
red f0x, насколько я понимаю если воспользоваться твоим методом, то при вызове программы в первый раз, во воторй или в третий раз рандом будет получаться один и тот же...

Или я ошибаюсь??

Добавлено: 26 янв 2006, 12:48
constab
Вопос не потеме...

Есть программа, которая создает файл например в каталоге /etc, и доступ для записи имеет только root...

Как мне сделать, что бы эта программа работала от правов root, что бы обычный пользователь мог воспользоваться этой программой?

Добавлено: 26 янв 2006, 12:57
Llama
man sudo
man chmod

Добавлено: 26 янв 2006, 14:31
red f0x
constab, srand () вызывать надо, но только один раз - где-то в main (), например, а не при каждом вызове rnd ().
Зачем реинициялизировать генератор случайных чисел каждый раз, когда нужно псевдослучайное число? 8)

Добавлено: 26 янв 2006, 14:42
constab
Llama, При использовании sudo, пользователь должен вводить пароль...
chmod выставляю, что принадлежит руту и разрешаю выполнение программы другим пользователям, но кроме root никто не может создать файл :(

Добавлено: 26 янв 2006, 15:05
Llama
constab, пользователь не обязательно дожен вводить пароль при использовании sudo, man sudoers ;)
А по вайшей проблеме - chmod +s возможно будет достаточно...

Добавлено: 26 янв 2006, 17:38
michael
constab, если тебе нужна такая программа, значит ты что-то делаешь не так:) Опиши проблему подробно, может у неё есть более другое решение?