You wrote that you want to "have below diagonal (lower triangle) [elements be the] same as above diagonal (upper triangle) elements." In the future you can just say that you want a matrix to be "symmetric," and that will be clear.
I wrote up some code which I think will work for your purposes:
function mat = generate_matrix( n )
% "n" is the number of rows / columns the output named "mat" will have.
sml_val_min = 0;
sml_val_max = 0.5;
big_val_min = 0.5;
big_val_max = 1;
% The number of elements in the upper triangular portion of the matrix can be
% represented by an Arithmetic Series.
% There is a row with one element, then a row with 2 elements, then a row
% with 3, on up to a row with n - 1 elements.
% So, there are 1 + 2 + ... + n-1 = (n-1)*n/2 elements in total.
numel_in_up_tri_portion = (n-1)*n/2;
% determine how many distinct small values we need to generate and how many large values
numel_sml = floor(numel_in_up_tri_portion/2);
numel_big = ceil(numel_in_up_tri_portion/2);
% Generate small values and large values
sml_vals = (sml_val_max - sml_val_min).*rand(1, numel_sml) + sml_val_min;
big_vals = (big_val_max - big_val_min).*rand(1, numel_big) + big_val_min;
% decide where in the matrix small values will go and where large values will go
sml_val_locations = randsample(numel_in_up_tri_portion, numel_sml);
big_val_locations = setdiff(1:numel_in_up_tri_portion, sml_val_locations);
%
[rs, cs] = convert_linear_index_to_row_and_col( sml_val_locations );
[rb, cb] = convert_linear_index_to_row_and_col( big_val_locations );
mat = zeros(n);
for k = 1:numel_sml
mat(rs(k), cs(k)) = sml_vals(k);
end
for k = 1:numel_big
mat(rb(k), cb(k)) = big_vals(k);
end
mat = mat + mat';
end % of function definition
function [row, col] = convert_linear_index_to_row_and_col( lin_ind )
unity = ones(size(lin_ind));
% Solve the quadratic equation (row^2 - row)/2 = lin_ind
row = ceil(0.5 * (unity + (unity + 8*lin_ind).^0.5));
%
col = lin_ind - 0.5*(row - unity).*(row - 2*unity);
end % of function definition