Sphere

Generate random points on a sphere.

points = SpherePoints[100];
Graphics3D[Point[points]]

Find the convex hull of the points. This gives a simplicial complex homeomorphic to the sphere.

mesh=ConvexHullMesh[points]

Count how many vertices, edges, and faces are in the simplicial complex.

counts=MeshCellCount[mesh]

Compute the Euler characteristic.

counts[[1]]-counts[[2]]+counts[[3]]

Torus

Graphics3D[Torus[]]

Here is some code that draws a triangulated torus and displays the number of simplices in each dimension:

drawGeometricRealization3D[complex_,points_]:=Module[
{verts={}, edges={}, faces={},tetrahedra={},graphics},

(* make lists of simplices of each dimension *) 
Do[
If[Length[simplex]==1,AppendTo[verts,points[[simplex[[1]]]]]];
If[Length[simplex]==2,AppendTo[edges,points[[simplex]]]];
If[Length[simplex]==3,AppendTo[faces,points[[simplex]]]];
If[Length[simplex]==4,AppendTo[tetrahedra,points[[simplex]]]]
,{simplex,complex}];

(* print counts of simplices in each dimension *) 
Print["number of 0-simplices: ",Length[verts]];
Print["number of 1-simplices: ",Length[edges]];
Print["number of 2-simplices: ",Length[faces]];
Print["number of 3-simplices: ",Length[tetrahedra]];

(* return the drawing *) 
graphics=Join[
If[Length[tetrahedra]>0,{Purple,Opacity[0.85],Tetrahedron[tetrahedra]},{}],
{Cyan,Opacity[0.4],Triangle[faces],Black,Opacity[1],Thick, Line[edges],PointSize[Large],Point[verts]}
];
Graphics3D[graphics] 
]
pointsTorus={{0,0,0},{0,0,1},{-0.4,-0.4,0.5},{1,0,0},{1,0,1},{1.5,-0.2,0.5},{0,1,0},{0,1,1},{-0.2,1.5,0.5}};
torus={{1},{2},{3},{4},{5},{6},{7},{8},{9},{1,2},{1,3},{1,4},{1,5},{1,6},{1,7},{2,3},{2,5},{2,7},{2,8},{2,9},{3,6},{3,5},{3,7},{3,9},{4,5},{4,6},{4,7},{4,8},{4,9},{5,6},{5,8},{6,8},{6,9},{7,8},{7,9},{8,9},{1,2,5},{1,2,7},{1,3,6},{1,3,7},{1,4,5},{1,4,6},{2,3,5},{2,3,9},{2,7,8},{2,8,9},{3,5,6},{3,7,9},{4,5,8},{4,6,9},{4,7,8},{4,7,9},{5,6,8},{6,8,9}};
drawGeometricRealization3D[torus,pointsTorus]

The Euler characteristic of the triangulated torus is 9-27+18=0.

A surface with large genus

(* code from https://reference.wolfram.com/language/ref/BoundaryMeshRegion.html.en?view=all *)
rectangleCoords[{i_,j_}]:=rectangleCoords[{i,j},{0.5,0.5}];
rectangleCoords[{i_,j_},{α_,β_}]:={{i-α/2,j-β/2},{i+α/2,j-β/2},{i+α/2,j+β/2},{i-α/2,j+β/2}};
rectangleIndexes[i_]:=Line[i-1+{1,2,3,4,1}];
RectangleHoleMesh[{m_,n_}]:=Module[{oc,hc},hc=Flatten[Table[rectangleCoords[{i,j}],{j,n},{i,m}],2];
oc={{0,0},{m+1,0},{m+1,n+1},{0,n+1}};
BoundaryMeshRegion[Join[hc,oc],rectangleIndexes[4 m n+1],Sequence@@Table[rectangleIndexes[i],{i,1,4 m n,4}]]]
TunnelMesh[{m_,n_}]:=BoundaryMesh[RegionProduct[TriangulateMesh[RectangleHoleMesh[{m,n}],MeshQualityGoal->"Minimal"],MeshRegion[{{0},{1}},Line[{1,2}]]]]

Here is an interesting surface with lots of holes.

tm=TunnelMesh[{4,3}]

Count how many vertices, edges, and faces are in the simplicial complex.

counts=MeshCellCount[tm]

Compute the Euler characteristic.

counts[[1]]-counts[[2]]+counts[[3]]