реклама на сайте
подробности

 
 
> Как функцией rand() получить число от 0 до 2 ?
-=Женек=-
сообщение Jan 13 2008, 11:33
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Как функцией rand() получить число от 0 до 2 ?
Да и объясните про srand() я каждый раз в цикле вызываю srand(rand()); но на работу rand() это не оказывает влияния.

короче говоря у меня есть массив Current[3], его нужно заполнить числами от 0 до 2

for (y=0;y<3;y++)
{
srand(rand());
Current[y]= что здесь?

}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ReAl
сообщение Jan 13 2008, 19:29
Сообщение #2


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Я дал рабочий пример (с учётом поправки, сначала по ошибке написал while(r != 3) а надо while( r == 3) ).
Как правило я проверяю код перед отправкой, но тут не проверял, так как был уверен в работоспособности (в случае применения вменяемого компилятора С и достаточно стандартной библиотекой).

Нужна проверка? "Их есть у меня"
CODE
#include <stdio.h>
#include <stdlib.h>

unsigned char rnd3(void)
{
unsigned char val;
do {
val = rand() & 0x03;
} while( val == 3);
return val;
}


unsigned char rnd3div(void)
{
return ((rand()-2768)/10000);
}

unsigned char rnd3mod(void)
{
return rand() % 3;
}


void test( char *header, unsigned char (*rndfunc)(void), int count)
{
int i, prev;
int gist[3] = {0};
int gist2[3][3] = { {0} };

printf("\n-------------------------------\n%s\nvalue table\n", header);

prev = rnd3();
for( i = 0; i < count; ++i) {
unsigned char r = rndfunc();
printf( (i & 0x1F) == 0 ? "\n%2d" : "%2d" , r );
++gist[r];
++gist2[prev][r];
prev = r;
}

printf("\n\n%s - frequency table\n", header);
for( i = 0; i < 3; ++i)
printf( "%d -> %3d\n", i, gist[i] );

printf("\n%s - prev/curent frequency table\n", header);
printf(" 0 1 2\n");

for( i = 0; i < 3; ++i)
printf( "%d%6d%6d%6d\n", i, gist2[i][0], gist2[i][1], gist2[i][2] );

}


int main(void)
{
test( "rand() & 0x03", rnd3, 1024);
test( "(rand() - 2768) / 10000", rnd3div, 1024);
test( "rand() % 3", rnd3mod, 1024);

return 0;
}


mingw32-gcc -O2 -s rnd3.c -o rnd3.exe
rnd3 >rnd3.txt

CODE

-------------------------------
rand() & 0x03
value table

2 0 1 0 2 2 2 0 1 1 1 1 2 0 0 2 1 0 2 1 0 2 2 2 1 0 2 2 1 1 0 1
1 0 0 2 1 1 1 1 2 0 2 2 0 2 0 2 0 0 2 1 2 1 2 2 2 1 1 0 1 0 2 0
0 2 0 0 0 2 1 2 2 2 1 1 1 2 0 2 1 2 1 2 1 1 0 0 2 1 1 1 1 0 2 2
1 0 2 0 2 2 1 0 2 2 1 1 1 1 1 1 2 1 0 2 2 2 2 1 0 0 2 2 0 1 0 1
2 2 0 2 0 0 1 0 0 0 1 2 1 2 2 0 0 0 1 0 1 2 1 1 2 1 0 0 1 0 2 0
0 0 1 1 2 1 1 2 0 0 2 2 0 0 2 1 1 2 1 1 0 2 2 0 2 2 1 2 0 0 2 2
0 0 2 2 2 1 1 2 0 0 1 2 2 1 1 0 0 1 0 0 2 1 1 0 1 1 2 1 2 1 0 2
1 1 0 0 1 2 1 1 0 1 0 0 1 2 1 1 0 1 0 2 1 0 1 1 1 2 1 1 1 0 2 1
0 2 2 2 1 0 2 1 1 1 0 0 0 1 1 0 1 2 2 2 1 0 0 2 1 1 2 1 2 0 0 1
0 2 2 1 1 2 1 2 2 0 2 1 2 2 1 1 2 2 0 2 2 0 1 2 1 2 1 1 2 0 0 1
2 0 1 2 1 0 0 1 1 0 1 1 1 0 2 2 2 0 0 0 1 2 2 2 1 0 0 1 2 0 2 0
1 0 2 2 2 2 2 1 0 2 0 0 0 0 2 2 1 2 0 2 0 1 2 2 1 1 2 1 1 0 0 2
2 0 1 1 1 0 0 2 0 2 2 1 0 2 0 0 0 2 1 0 1 2 2 1 1 0 2 0 1 0 1 0
1 1 2 0 0 1 0 1 0 0 0 0 2 1 0 0 2 1 2 1 1 1 1 0 2 1 0 1 0 1 1 1
1 1 0 0 1 2 0 2 2 0 1 1 0 0 2 2 2 1 1 1 2 2 2 1 2 2 1 1 2 1 2 0
1 0 1 2 0 1 0 1 1 2 2 1 0 2 0 0 1 0 1 0 2 2 1 0 0 1 0 0 1 2 1 1
2 1 1 2 0 0 2 0 1 0 1 1 0 0 1 1 0 1 1 1 0 1 2 1 1 1 0 0 1 0 2 0
0 2 2 2 0 1 2 2 1 0 0 2 1 0 2 0 2 1 2 2 0 0 0 1 1 0 2 2 1 2 1 1
0 1 0 1 0 2 2 1 0 0 0 2 1 0 1 1 0 0 1 1 1 1 0 2 0 0 1 2 2 0 2 2
1 2 0 0 0 2 1 2 1 1 0 0 1 2 0 2 2 1 1 1 0 0 0 2 1 2 0 0 0 2 2 1
1 0 1 2 0 1 1 0 0 1 2 2 0 0 0 2 2 2 1 1 1 2 2 2 2 2 1 1 0 0 0 2
1 2 2 0 0 0 1 1 1 0 0 0 2 2 2 1 0 0 1 2 1 1 0 2 1 2 0 2 1 2 0 1
1 0 0 1 1 2 1 2 2 1 2 1 2 0 1 1 1 1 1 2 0 0 1 2 0 0 2 2 1 2 0 2
0 1 2 2 1 0 1 0 0 1 1 0 1 2 0 0 2 0 1 2 1 1 0 1 0 1 2 2 1 1 2 0
0 1 0 0 1 1 2 0 0 2 2 1 0 0 2 1 2 1 0 1 2 1 0 1 1 2 2 0 2 2 1 0
0 2 2 1 0 0 2 1 0 0 2 1 0 0 0 2 2 2 0 0 1 2 2 2 2 2 0 2 1 2 2 2
0 1 1 2 2 2 2 0 0 2 0 0 2 0 2 0 1 2 1 0 0 2 1 1 2 1 0 0 0 2 0 1
2 2 2 2 2 0 1 2 1 0 2 2 1 0 1 2 1 0 1 1 2 2 1 1 2 1 0 1 2 1 0 2
0 1 1 1 0 1 0 2 0 0 1 1 0 1 0 2 0 2 0 0 1 0 2 1 1 1 1 1 0 2 1 0
2 1 2 1 0 1 1 1 0 0 2 0 2 2 2 2 2 0 2 0 2 0 2 0 2 0 1 2 1 1 1 2
2 2 1 0 0 0 0 2 0 0 2 0 2 2 1 2 2 0 0 0 0 2 1 2 0 0 2 2 0 0 2 0
2 1 0 2 1 1 2 1 0 0 0 0 2 1 0 0 1 0 1 2 1 1 1 2 0 2 1 0 2 1 1 1

rand() & 0x03 - frequency table
0 -> 336
1 -> 352
2 -> 336

rand() & 0x03 - prev/curent frequency table
0 1 2
0 115 102 119
1 125 120 107
2 96 130 110

-------------------------------
(rand() - 2768) / 10000
value table

1 1 2 1 2 2 2 0 1 2 0 1 0 1 0 0 0 2 1 1 0 0 2 2 0 0 0 0 2 0 0 0
0 2 1 0 0 0 0 1 0 1 0 1 2 0 0 0 1 2 1 2 0 2 2 1 1 1 1 0 2 0 0 0
0 1 2 0 2 0 2 0 0 1 0 0 1 2 0 2 0 2 1 0 0 0 1 0 0 0 0 2 2 1 2 0
1 1 2 0 1 2 2 2 2 1 0 2 0 1 1 1 2 0 1 0 1 0 0 0 0 2 2 0 1 0 2 0
1 2 1 2 1 1 1 1 2 2 0 0 1 0 1 1 2 1 0 1 0 1 2 0 0 1 0 0 2 2 0 0
1 1 2 1 0 1 0 1 2 0 1 2 1 1 1 2 0 0 0 0 0 1 1 0 0 1 0 0 2 1 2 0
0 1 0 0 1 2 0 2 0 2 1 0 0 1 0 1 2 2 0 1 2 2 0 0 2 2 1 0 1 0 1 0
0 2 0 0 0 0 0 0 0 0 0 0 1 2 2 1 2 0 1 1 2 0 2 0 0 2 2 1 2 0 0 0
2 2 1 2 0 2 1 0 2 0 0 0 1 1 1 0 2 0 0 2 1 2 0 0 1 1 1 2 2 0 1 2
0 2 1 0 0 0 0 0 0 2 1 2 0 1 2 2 2 2 0 0 0 2 0 2 0 2 0 0 1 2 0 1
1 0 1 1 2 2 2 1 2 1 0 0 0 2 2 0 0 0 0 0 2 0 1 0 2 1 2 0 1 2 1 1
2 0 0 2 2 0 2 0 2 0 0 0 1 1 1 0 0 0 0 1 0 0 2 1 0 2 2 0 0 2 1 0
0 1 2 1 0 2 1 0 1 2 2 1 1 2 1 0 2 1 0 1 0 0 1 2 0 2 2 1 0 1 1 0
1 1 1 2 0 0 0 0 0 0 1 2 1 0 1 2 2 0 2 0 0 1 0 2 1 0 0 0 2 1 0 0
1 2 1 0 1 2 0 1 1 0 0 1 0 0 1 2 1 0 1 1 1 1 2 0 1 0 0 0 0 1 2 1
1 1 1 1 0 2 0 2 1 2 1 2 1 0 2 2 0 2 0 0 2 2 0 1 0 0 2 1 0 0 1 0
0 0 1 2 1 1 0 0 2 0 0 0 0 0 2 0 0 1 2 1 0 2 0 2 0 2 1 0 2 0 1 2
1 1 0 1 1 0 1 2 0 0 1 2 0 2 2 2 0 1 1 0 0 0 1 0 1 1 2 2 2 1 0 0
0 2 2 1 0 2 1 0 1 2 0 2 0 1 1 0 2 1 1 0 1 2 0 1 0 0 2 2 2 2 1 2
2 1 2 2 0 2 0 1 1 2 2 2 0 1 1 1 1 2 1 0 1 0 2 0 0 2 0 1 0 1 1 0
1 0 0 1 2 2 1 1 0 2 2 0 2 1 1 2 1 0 0 1 2 1 0 1 1 2 2 2 0 0 0 1
1 0 0 0 2 2 0 0 1 2 2 2 0 1 1 1 2 0 2 2 1 2 1 0 2 1 0 0 1 2 1 2
1 2 1 2 0 2 2 2 2 0 0 0 0 2 2 0 0 2 1 0 2 2 1 0 1 1 2 2 2 0 1 2
1 0 1 1 2 1 1 0 0 0 0 1 0 1 2 0 2 1 2 0 0 1 2 2 0 0 1 2 0 1 0 1
0 2 2 2 1 0 0 2 1 1 2 2 2 2 1 1 2 2 0 2 0 0 0 2 2 1 0 0 0 1 2 0
0 1 2 1 0 2 2 1 0 2 1 1 0 2 2 2 1 0 1 2 1 1 0 1 0 2 0 2 2 1 0 1
1 2 2 0 2 1 2 2 1 0 0 0 2 0 0 0 2 2 0 0 0 2 0 2 2 0 1 0 0 0 2 2
0 0 2 2 1 1 0 0 0 2 0 0 0 0 1 0 2 1 1 2 1 2 1 0 0 0 2 2 1 0 1 0
1 0 1 0 1 1 2 2 1 0 2 2 0 0 1 0 2 1 2 1 2 1 2 0 2 2 0 0 0 2 2 1
0 0 0 1 1 2 2 1 2 1 2 0 0 0 1 0 0 2 2 2 1 1 2 0 2 0 1 0 1 0 0 2
1 2 2 1 0 1 1 2 2 2 1 0 0 1 2 1 1 1 0 2 0 2 0 2 0 1 0 0 0 0 0 2
1 0 2 1 1 1 2 1 1 1 0 0 2 2 1 2 2 2 2 0 1 1 2 2 2 1 1 1 2 2 1 0

(rand() - 2768) / 10000 - frequency table
0 -> 402
1 -> 309
2 -> 313

(rand() - 2768) / 10000 - prev/curent frequency table
0 1 2
0 168 123 110
1 121 80 109
2 113 106 94

-------------------------------
rand() % 3
value table

2 0 2 0 1 1 1 2 1 2 0 0 2 1 2 2 2 1 1 0 1 0 1 0 1 2 0 1 0 0 0 1
2 2 2 1 1 1 1 0 0 0 1 1 2 2 2 2 1 1 0 0 0 2 2 0 2 0 2 0 2 1 0 1
2 1 0 1 1 0 1 2 0 0 2 0 2 0 0 2 2 2 2 1 2 2 0 1 1 1 0 2 2 0 2 2
2 0 0 1 1 0 1 0 1 2 0 1 2 2 2 0 0 2 1 0 1 1 2 1 0 1 2 0 1 1 2 1
0 0 2 0 2 1 2 1 2 2 0 1 0 0 0 0 0 0 0 1 2 1 0 1 1 2 2 2 0 2 0 2
1 1 0 1 2 1 0 1 1 0 1 2 1 1 0 2 0 1 1 0 0 2 0 2 1 1 2 1 1 1 1 0
1 0 1 0 0 2 1 1 1 2 2 0 2 1 1 1 0 0 2 2 0 1 2 1 0 2 1 0 1 1 0 1
2 0 2 0 2 2 1 0 0 2 1 0 0 1 0 0 1 2 0 1 1 1 0 2 1 1 1 2 2 0 1 0
0 1 2 0 1 2 1 1 2 2 1 1 0 2 1 1 2 1 0 0 2 1 1 2 2 2 2 0 1 0 2 1
0 1 1 2 0 1 1 1 1 2 2 1 1 2 2 1 2 1 0 2 0 2 1 0 1 2 0 2 2 0 0 1
0 1 2 2 1 1 0 2 0 1 1 1 2 2 0 0 1 1 0 0 2 0 1 2 1 2 1 0 2 0 1 0
2 0 0 0 0 1 2 1 1 1 0 1 2 2 0 2 1 2 0 2 1 2 0 2 2 1 0 0 2 2 2 2
1 1 0 0 2 1 1 1 1 0 0 2 0 2 0 1 1 1 2 1 0 2 0 1 2 0 1 0 1 0 1 2
2 0 2 0 1 0 0 1 2 1 1 0 1 0 1 1 2 1 0 1 0 1 0 1 2 2 1 2 2 2 1 0
0 1 0 1 1 2 1 0 2 2 2 2 0 0 0 1 2 0 1 0 0 0 1 2 2 0 1 1 1 1 0 2
0 0 0 2 2 0 0 1 2 0 2 0 0 1 1 2 2 1 0 0 2 0 0 2 2 1 2 2 0 2 2 2
1 0 1 2 1 0 0 1 2 0 0 1 0 1 1 0 2 0 2 1 2 1 1 2 2 2 0 2 1 1 1 1
2 2 1 0 2 2 0 0 1 2 2 0 1 0 1 0 2 1 2 0 2 1 0 2 2 1 1 0 2 2 0 1
1 0 1 0 0 0 0 1 0 0 1 1 2 1 0 2 2 2 1 2 1 0 0 0 1 2 2 0 0 2 1 1
2 2 0 0 1 0 1 2 2 0 2 0 0 0 2 1 1 2 2 2 1 2 0 0 0 2 2 2 1 0 2 2
0 2 1 0 0 2 0 2 0 0 0 1 1 2 0 1 0 1 0 0 2 1 0 0 0 2 1 1 1 0 0 1
2 0 2 1 2 0 1 2 1 1 2 1 1 2 1 2 2 1 0 2 1 0 1 1 1 0 1 0 0 0 1 1
0 2 2 0 2 1 0 1 0 2 1 0 2 2 0 2 1 0 2 2 1 2 2 2 1 2 1 1 0 0 2 1
2 0 2 1 0 2 2 1 0 2 0 2 0 1 2 0 0 1 2 0 1 2 0 1 1 2 0 0 0 0 2 0
1 0 1 1 0 1 1 1 2 2 2 2 2 1 1 0 1 2 2 2 0 0 1 0 0 0 2 0 2 2 2 1
0 1 0 2 0 1 2 1 1 2 2 0 0 1 2 0 2 1 0 0 0 0 1 1 0 2 2 0 2 0 2 0
2 1 0 0 1 0 0 1 0 1 2 0 0 0 2 2 0 0 0 2 1 2 0 0 1 1 0 2 2 2 0 0
0 0 0 0 1 2 1 0 0 0 0 2 2 1 1 2 1 2 1 2 2 1 2 1 2 2 1 1 2 2 1 0
1 1 0 0 2 0 2 2 0 1 1 2 2 0 2 0 2 0 1 0 1 0 1 2 2 1 1 2 1 0 0 0
2 2 2 2 0 1 0 1 0 2 2 0 1 1 1 2 2 1 0 0 1 0 0 1 2 1 0 1 0 0 0 0
2 1 0 1 1 2 0 1 0 2 2 2 0 2 0 0 2 2 2 2 0 2 1 0 1 1 1 1 0 1 1 2
0 2 2 1 1 2 0 2 1 1 2 1 2 0 0 1 1 0 1 1 1 0 2 1 2 1 2 1 2 1 0 0

rand() % 3 - frequency table
0 -> 348
1 -> 344
2 -> 332

rand() % 3 - prev/curent frequency table
0 1 2
0 109 126 112
1 128 104 112
2 111 114 108


И, чтобы легче сравнивать, только распределения.
Код
-------------------------------
rand() & 0x03 - frequency table
0 -> 336
1 -> 352
2 -> 336

rand() & 0x03 - prev/curent frequency table
      0     1     2
0   115   102   119
1   125   120   107
2    96   130   110

-------------------------------
(rand() - 2768) / 10000 - frequency table
0 -> 402
1 -> 309
2 -> 313

(rand() - 2768) / 10000 - prev/curent frequency table
      0     1     2
0   168   123   110
1   121    80   109
2   113   106    94

-------------------------------
rand() % 3 - frequency table
0 -> 348
1 -> 344
2 -> 332

rand() % 3 - prev/curent frequency table
      0     1     2
0   109   126   112
1   128   104   112
2   111   114   108

Как видим, мой примитив с выдёргиванием двух младших битов и отбрасыванием троек даёт распределения немного хуже, чем "%3", но лучше, чем "/10000".
Зато обходится без деления.

Вообще говоря, гонять нужно было с srand(1) перед каждым тестом и (RAND_MAX+1) проб, а не 1024, но и этого достаточно.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- -=Женек=-   Как функцией rand() получить число от 0 до 2 ?   Jan 13 2008, 11:33
- - IgorKossak   Функция int rand(void) возвращает целое число в ди...   Jan 13 2008, 11:50
|- - Petka   Цитата(IgorKossak @ Jan 13 2008, 14:50) Ф...   Jan 13 2008, 11:57
|- - zltigo   Цитата(IgorKossak @ Jan 13 2008, 13:50) П...   Jan 13 2008, 11:59
|- - ReAl   Цитата(IgorKossak @ Jan 13 2008, 13:50) Ф...   Jan 13 2008, 13:33
|- - zltigo   Цитата(ReAl @ Jan 13 2008, 15:33) А-а-а...   Jan 13 2008, 13:59
- - -=Женек=-   мне не нужна плавающа точка. Ваш пример не работае...   Jan 13 2008, 12:21
|- - zltigo   Цитата(-=Женек=- @ Jan 13 2008, 14...   Jan 13 2008, 12:52
- - Rst7   ЦитатаТак просто не отделаетесь - Автор хотел диа...   Jan 13 2008, 14:55
- - ReAl   Да, конечно, while( r == 3), это я глюкнул - не ус...   Jan 13 2008, 15:01
- - -=Женек=-   Господа, ну конкретный результат кто-нибудь может ...   Jan 13 2008, 15:43
|- - Сергей Борщ   Цитата(-=Женек=- @ Jan 13 2008, 17...   Jan 13 2008, 16:21
|- - zltigo   Цитата(Сергей Борщ @ Jan 13 2008, 18:21) ...   Jan 13 2008, 17:09
- - -=Женек=-   брр... а RAND_MAX тогда чему равен? И к чему эти д...   Jan 13 2008, 16:34
- - Kirill Trusov   я конечно салага но 3 вопроса 1. для какого компи...   Jan 13 2008, 16:41
- - -=Женек=-   Цитатая конечно салага но 3 вопроса 1. для какого...   Jan 13 2008, 17:35
|- - zltigo   Цитата(-=Женек=- @ Jan 13 2008, 19...   Jan 13 2008, 17:47
- - -=Женек=-   Знаете, за что я благодарен форуму? Пока дождешься...   Jan 13 2008, 18:26
|- - zltigo   Цитата(-=Женек=- @ Jan 13 2008, 20...   Jan 13 2008, 18:36
- - -=Женек=-   Я прекрасно понимаю что делаю, это вы не понимаете...   Jan 13 2008, 18:45
|- - zltigo   Цитата(-=Женек=- @ Jan 13 2008, 20...   Jan 13 2008, 18:51
|- - Сергей Борщ   Цитата(zltigo @ Jan 13 2008, 20:51) НАДО ...   Jan 13 2008, 19:14
|- - zltigo   Цитата(Сергей Борщ @ Jan 13 2008, 21:14) ...   Jan 13 2008, 19:31
|- - ReAl   Цитата(zltigo @ Jan 13 2008, 21:31) Подст...   Jan 13 2008, 19:55
|- - zltigo   Цитата(ReAl @ Jan 13 2008, 21:55) вполне ...   Jan 13 2008, 20:29
- - -=Женек=-   И что? ну пусть будет 31232, делим на 3, получаем ...   Jan 13 2008, 19:02
- - Rst7   ЦитатаПРоделайте свой код с каждым из них в письме...   Jan 13 2008, 19:04
- - Rst7   Другое дело, что деление сюда прикладывать как-то ...   Jan 13 2008, 19:19
- - Rst7   ЦитатаВроде нигде не промахнулся... Таки немного ...   Jan 13 2008, 19:51
- - mdmitry   Вопрос в дискуссию: кто-нибудь из авторов варианто...   Jan 13 2008, 21:44
|- - zltigo   Цитата(mdmitry @ Jan 13 2008, 23:44) Там ...   Jan 13 2008, 21:49
|- - Kirill Trusov   Цитата(mdmitry @ Jan 13 2008, 23:44) Вопр...   Jan 15 2008, 19:52
- - Elegorod   Кодint a = (new java.util.Random()...   Jan 14 2008, 19:57


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01418 секунд с 7
ELECTRONIX ©2004-2016