Выбор целых чисел через дискретные интервалы с помощью c

#c #random #integer #set #intervals

Вопрос:

Задан набор из N целых чисел (все они находятся на расстоянии 1 единицы друг от друга) Я хотел бы создать вектор, используя каждое из этих чисел T раз каждое.

Допустим, X= [1,2,…,N] — это мой набор чисел, и я хочу создать вектор размером T. N таким образом, чтобы каждый x в X появлялся $T$ раз каждый (порядок не имеет значения).

Моя идея заключается в следующем:

Используя оригинальную библиотеку c , я выбираю случайное число из X и сохраняю количество раз, когда это число было выбрано, после того,как некоторые x будут выбраны T раз, я разбиваю набор X на две части, скажем, X1=[1,2,…, x) и X2=(x,…, N]. Поэтому, чтобы случайным образом выбрать следующее число, я генерирую равномерное (0,1) число раньше, если оно больше 1/2, я выбираю новое число поверх X2 и из X1 в противном случае.

Продолжая в том же духе, предположим, что теперь есть K чисел, которые уже были выбраны T раз. Я выберу следующее число из одного из наборов K 1, сгенерированных путем удаления этих выбранных значений. Чтобы выбрать некоторые из этих интервалов, я снова генерирую число (0,1) и «разбиваю» интервал (0,1) на K 1 равные части длины (1/K 1) и соответственно выбираю следующий набор.

Имеет ли это смысл?

Комментарии:

1. вы спрашиваете, как это можно было бы реализовать в C ?

2. Просто добавьте X T раз к себе. И перемешайте результат, если вам нужно случайное распределение.

3. Если генерация этого вектора является шагом к выборке из дискретного распределения, то a std::discrete_distribution достигнет выборки, которую вы описываете.

Ответ №1:

Как насчет того, чтобы скопировать список в вектор три раза, а затем рандомизировать? <algorithm> имеет std::random_shuffle() и std::shuffle() .