Другие языки программирования и технологии

Есть четыре переменные, нужно рандомом присвоить им значения от 0 до 3, так чтобы значения не повторялись. пишу на Си)

a=random(4);
b=random(4);
while(b==a){b=random(4);}
c=random(4);
while(c==a && c==b){c=random(4);}
d=random(3);
while(d==a && d==b && d==c) {d=random(4);}

написал так, но значения всё равно повторяются
У тебя && вместо ||,
А вообще "нужно рандомом присвоить им значения от 0 до 3, так чтобы значения не повторялись" - это "нужно топором забить гвоздь". Это делается никак не "рандомом", он для этого совершенно не предназначен. Хотя в принципе можно, но, как у тебя в программе, сложнее. Нормально это делается тасованием по алгоритму Кнута. И уж конечно, random(3) никогда не выдаст 3, достаточно прочитать описание этой функции.
МБ
Мурад Бурджалиев
65 053
Лучший ответ
задайте массив, пусть будет a = {0,1,2,3}
В цикле получаем индекс1 как текущий. И индекс2 со случайным значением от 0 до 4.
Меняем местами значения в массиве с индекс1 и индекс2, соотв a[0] a[1] a[2] a[3] будут (вероятно) не упорядочены и иметь разные значения.

P.S: В C++ есть random_shuffle для таких случаев http://www.cplusplus.com/reference/algorithm/random_shuffle/ , но у Вас C.

P.P.S: Я смотрю никого не смущает условие "так чтобы значения не повторялись." =))
КЧ
Кuм Чuх-Пых
84 764
Bogdan Orlioglo Зачем это черезжопие если есть простой рандом?
эм... Почитай описание функции рандома.... сам посмеёшься....
Олег Герасимов
Олег Герасимов
15 046
Bogdan Orlioglo Вот из-за таких индусов в майкрософте винда и глючит)
Алгоритм тасования Саттоло
http://ideone.com/0AtJpd
MV
Mehmet Vural
11 083
int i;
int numPicked;
int rn[4] = { 0,1,2,3};
int result[4];
srand(time(NULL));

for (i = 0;i < 4; i++)
{
while (true)
{
numPicked = rand() % 4;
if (rn[numPicked] < 8)
{
result[i] = rn[numPicked];
rn[numPicked] = 9;
break;
}
}
}
for (i = 0;i < 4; i++)
{
cout << result[i] << " ";
}
system("pause");
Дичь, но работает ))

Похожие вопросы